如何在Vim中对多行重复编辑?


122

我知道在Vim中,我经常可以通过简单地在命令前添加一个数字来重复该命令。例如,一个人可以通过以下方式删除5行:

5dd

通常还可以指定一系列行来应用命令,例如

:10,20s:hello:goodbye:gc

如何执行“垂直编辑”?例如,我想在给定的每一行的开头(跳过空格,即在Shift-I之后在命令模式下键入逗号时会得到的内容)插入一个特定的符号(例如逗号)范围。如何做到这一点(不求助于下降期-下降期-下降期)?

Answers:


107

:10,20s/^/,/

或使用宏,记录以下内容:

q a i , ESC j h q

用于:

@ a

说明:q a开始记录宏注册aq结束记录。有寄存器a,以z供这一点。


谢谢。如果我想要相当于shift-i怎么办?也就是说,跳过初始空白吗?
saffsd

2
说明:^\(\s*\)捕获初始空白并将其保存到寄存器中,然后可以使用读取\1
Svante

136

Ctrl- v逐块进入可视模式。然后可以移动(hjkl正常情况下为-wise),如果要在多行中插入内容,请使用Shift- i

所以对于文本:

abc123abc
def456def
ghi789ghi

如果你打Ctrl- v与你的光标移到1,打j两次下井两列,然后Shift- i,ESC,你的文字是这样的:

abc,123abc
def,456def
ghi,789ghi

(多行插入内容会稍有滞后,直到您点击时才会渲染ESC)。


3
真好 顺便说一句,Ctrl-V表示大写,您可以说Ctrl-Shift-v
Svante

8
实际上,它是CTRL-v或CTRL-V。Vim对于CTRL-代码不区分大小写(请参见:help CTRL- {char})。

2
在搜索了该方法为什么不起作用的一些信息后,是因为它使用了大写字母I(shift-i)而不是i(而且,它只是ctrl-v,因为ctrl-shift-v将我移到了最后)
Willyfrog 2012年

4
我很好奇。他们为什么不使用i没有shift键的键呢?
off99555 '16

1
我不移动将插入当前位置。shift +我在行首插入
Kevin P


44

如果您已经在使用“。” 重复执行很多最后一条命令,然后我发现是迄今为止最方便的解决方案。它允许您通过使用以下命令在可视块的每一行上重复最后一个命令

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>

1
这是有帮助的,但由于 .在可视模式下行操作。我认为在这种情况下,可视模式有时可以方便地选择行范围。但是在这种情况下,命令和宏更加灵活和强大。
Bohr

23

我相信最简单的方法是

1)记录一行的宏,将其称为“ a”;在这种情况下,一种

ESC

2)选择要应用宏的行块

3)使用“规范”功能在该行代码块上执行宏“ a”,即

:'<,'>norm@a

17

我认为最简单的方法是记录一个宏,然后根据需要重复多次。例如,要在每行的开头添加逗号,请键入:

q a I , ESC j q

重复5次,您输入

5 @ a


2

将您的编辑保存在.操作员中之后,执行以下操作:

  1. 选择您想要将操作员应用于可视模式的文本
  2. 然后运行命令 :norm .

1

除了已回答的宏之外,对于在一系列行中插入逗号的特定情况(例如,从第10行到第20行),您可以执行以下操作:

:10,20s/\(.*\)/,\1

也就是说,您可以创建一个带有\(和\)的编号组匹配项,并在替换字符串中使用\ 1表示“用匹配项的内容替换”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.