将一组线附加到另一组线的末尾

时间:2012-01-05 16:57:39

标签: vim append

我有,例如,连续10行,然后是另外10行,例如,

1
2
:
10
a
b
:
j

我想将第二组线附加到第一组线的末尾,以便它看起来像这样:

1a
2b
:
10j

3 个答案:

答案 0 :(得分:3)

我会开始使用a,然后 CTRL-V 10j$d来阻止删除所有内容。

然后:set virtualedit=all,转到第一行,例如将光标右移10个字符,然后按p。现在删除十行中的第一个空格序列。

还有第二种方式,基本相同:

  • 10DD
  • :call setreg('"', @", ' ^ V ')其中 ^ V 使用CTRL-V CTRL-V键入 (这将按块方式转动寄存器)
  • P
  • :,+10s/ //g

您也可以以编程方式执行此操作:使用Q进入Ex模式,然后键入此

 let i = 1
 while i <= 10
    call setline(i, getline(i) . getline(11))
    11d
    let i = i + 1
 endwhile
 vi

如果您打算重复使用它,请将其放入您的vimrc:

 function PasteLines(startline,numlines)
     let i = 0
     while i < a:numlines
        call setline(a:startline+i, getline(a:startline+i) . getline(a:startline+a:numlines))
        exec '' . (a:startline+a:numlines) . 'd'
        let i = i + 1
     endwhile
 endfunction

并将其命名为:

 :call PasteLines(1, 10)

其中1是第一行,10是行数。因此你需要20行。

答案 1 :(得分:2)

这将是我的方式:

qaG"aDdd9-$"apq
9@a

说明:

q             # Begin recording typed characters...
a             # to register 'a'
G             # Set cursor in last line.
"aD           # Delete the content from the beginning of line till the end and save it in register 'a'.
dd            # Previous command deleted the content but left the line in blank, delete the complete line.
9-            # Go back 9 lines.
$             # Set cursor at the end of current line (last number in your example).
"ap           # Paste content of register 'a' (at end of line without newline character).
q             # Stop recording.
---------------
9             # Run nine times.
@a            # Commands of register 'a' (all previous commmands).
  • 注册'a'我记录命令的位置是我保存每行内容的不同寄存器,尽管它们的名称相同(字母'a')。

答案 2 :(得分:2)

假设光标位于二十行的第一行 阻止,让我们考虑以下简短的Ex命令:

:,+9g/^/''+10m.|-j!

这是在属于该范围的行上运行的:global命令 接下来的十行(从当前的一行开始)。在每一行中,有两行 依次执行Ex命令''+10m.-j!。第一个命令 取第光线位于光标所在的行下方 并将其插入光标当前所在行的正下方, 使用:move命令。 :join命令-j!附加刚刚移动的命令 直到它上面的那一行(没有插入或删除空格 之间,由于!修饰符)。

有两个需要考虑的因素需要考虑 了解那条线的运动。首先,在指定的命令之前 在另一条线上执行:global,光标位于 该行的第一列。这样,地址引用了 前面提到的:move命令为.,对应于最新的一行 该命令当前正在运行。第二,那条线的数量 在:global命令被发送到执行之前的当前命令是 添加到跳转列表中。因此,其地址可以在范围内获得 通过'伪标记(参见:help :range)。

通过普通模式命令可以实现相同的效果:

qqdd9+PgJ9-q9@q

这一系列命令使用宏来实现相同的移动方案 重复单行转移操作。连接的命令 第一对行dd9+PgJ9-使用。"q寄存器记录在q寄存器中 dd命令。与上面提出的Ex命令类似,宏删除 当前行(9+),将光标向下移动九行(P),插入 新光标位置(gJ)上方的正好切割线,连接这两行 不添加或删除它们之间的任何空格(9-),并移动 光标向上九行(@)。最后,这些动作是自动的 使用{{1}}命令迭代九次以加入剩余的九对 相应的行。