如何有效地将Vim中的一组行与另一组行连接起来?
比如说,我有10个连续的行,后面跟着另外10行,例如:如何有效地将Vim中的一组行与另一组行连接起来?,vim,Vim,比如说,我有10个连续的行,后面跟着另外10行,例如: 1 2 ⋮ 10 a b ⋮ j 我想将第二个范围(a..j)中的行附加到第一个范围(1..10)中的行,以便将上述20行改为以下10行: 1a 2b ⋮ 10j 我可以使用哪些Vim命令来实现这一点?我将开始使用a,然后按CTRL-V、10j$d以块方式删除所有内容 然后:设置virtualedit=all,转到第一行,将光标向右移动10个字符,然后按p。现在删除十行中的第一个空格序列 还有第二种方法,基本相同: 10日 :调用se
1
2
⋮
10
a
b
⋮
j
我想将第二个范围(a
..j
)中的行附加到第一个范围(1
..10
)中的行,以便将上述20行改为以下10行:
1a
2b
⋮
10j
我可以使用哪些Vim命令来实现这一点?我将开始使用
a
,然后按CTRL-V、10j$d
以块方式删除所有内容
然后:设置virtualedit=all
,转到第一行,将光标向右移动10个字符,然后按p。现在删除十行中的第一个空格序列
还有第二种方法,基本相同:
- 10日
^V:调用setreg(“”、@“、”
其中^V是用CTRL-V CTRL-V键入的)
(这将以块方式打开寄存器)- P
:,+10s///g
let i = 1
while i <= 10
call setline(i, getline(i) . getline(11))
11d
let i = i + 1
endwhile
vi
其中1是第一行,10是行数。因此,您需要20行。这将是我的方式:
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”)
:,+9g/^/''+10m.|-j!
这是在属于的行上运行的:global
命令
接下来十行的范围(从当前行开始)。每
在这些行中,有两个Ex命令,''+10m.
和-j代码>,按顺序排列
执行。第一个命令取第行下的第十行
光标已定位并将其插入到
使用:move
命令,光标当前所在的行。
:join
命令,-j代码>,将刚移动的行附加到
就在它上面(不插入或删除中间的空白,
由于!
修改器)
有两个考虑因素是必要考虑的
为了了解那条线的运动。首先,在命令之前
在另一行(光标)上执行:global
中指定的
位于该行的第一列。这边是地址
在上述:move
命令中引用为
,对应
到当前正在其上运行命令的最新行。
第二,前一行的当前行数
一个:global
命令被发送到执行,并被添加到跳转列表中。
因此,它的地址可以通过
”
伪标记(请参见:帮助:范围
)
另见问题“”
2.通过正常模式命令可以实现相同的效果:
qqdd9+PgJ9-q9@q
此命令序列使用
宏以重复单行传输操作。命令
连接第一对行,dd9+PgJ9-
,记录在
使用q
命令注册q
。与Ex命令类似
如上所述,宏删除当前行(dd
),移动
光标向下移动九行(9+
),将刚剪切的线插入到
新的光标位置(P
),将两行连接起来,而不添加或
删除它们之间的任何空格(gJ
),并将光标移动九次
向上(9-
)行。最后,这些操作将自动迭代
九次使用@
命令连接其余九对
相应的行。由于您的建议之一是更改寄存器类型,我认为应该提到Ingo Karkat的无条件粘贴插件。因为它通过一个相当不错的映射gbP
。这是一个多么过度的工程!这是一项工作,甚至比调用setreg()
或PasteLines()都要短
。”
命令中的:g
标记的作用是什么?(你能带我到相关的帮助部分吗?我似乎已经找到了它,但找不到)@Benoit:The”
伪标记在这里与其他地方的含义相同。请参见上面的解释和:help:range
,:help“”
,:help jumplist
。另请参见关于此问题的泛化的问题:“”。
:,+9g/^/''+10m.|-j!
qqdd9+PgJ9-q9@q