我有,例如,连续10行,然后是另外10行,例如,
1
2
:
10
a
b
:
j
我想将第二组线附加到第一组线的末尾,以便它看起来像这样:
1a
2b
:
10j
答案 0 :(得分:3)
我会开始使用a
,然后 CTRL-V ,10j$d
来阻止删除所有内容。
然后:set virtualedit=all
,转到第一行,例如将光标右移10个字符,然后按p。现在删除十行中的第一个空格序列。
还有第二种方式,基本相同:
:call setreg('"', @", '
^ V ')
其中 ^ V 使用CTRL-V CTRL-V键入
(这将按块方式转动寄存器):,+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).
答案 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}}命令迭代九次以加入剩余的九对
相应的行。