如何在Vim中的多行上重复编辑?
我知道在Vim中,我通常可以通过简单地在命令前面添加一个数字来重复命令。例如,可以通过以下方式删除5行:如何在Vim中的多行上重复编辑?,vim,Vim,我知道在Vim中,我通常可以通过简单地在命令前面添加一个数字来重复命令。例如,可以通过以下方式删除5行: 5dd 例如,通常还可以指定要应用命令的行范围 :10,20s:hello:goodbye:gc 如何执行“垂直编辑”?例如,我想在给定范围内每行的行号(跳过空格,即在命令模式下Shift-I后键入逗号)处插入一个特定符号,比如逗号。如何才能做到这一点(不必求助于停机期停机期停机期)?:10,20s/^/,/ 或使用宏,通过以下方式录制: q a i,ESC j h q 用于: @a 说
5dd
例如,通常还可以指定要应用命令的行范围
:10,20s:hello:goodbye:gc
如何执行“垂直编辑”?例如,我想在给定范围内每行的行号(跳过空格,即在命令模式下Shift-I后键入逗号)处插入一个特定符号,比如逗号。如何才能做到这一点(不必求助于停机期停机期停机期)?
:10,20s/^/,/
或使用宏,通过以下方式录制:
q a i,ESC j h q
用于:
@a
说明:
q a
开始录制宏以注册a
,q
结束录制。有寄存器a
到z
可用于此操作。我认为最简单的方法是录制一个宏,然后根据需要重复该宏多次。例如,要在每行的开头添加逗号,请键入:
q a I , ESC j q
要重复5次,请输入
5 @ a
除了宏之外,正如已经回答的,对于在一系列行中插入逗号的特定情况(例如从第10行到第20行),您可以执行以下操作:
:10,20s/\(.*\)/,\1
也就是说,您可以使用\(和\)创建编号的组匹配,并在替换字符串中使用\1表示“替换为匹配的内容”。Ctrl-v以块方式进入视觉模式。然后可以移动(hjkl-wise,正常情况下),如果要在多行上插入内容,请使用Shift-i
因此,对于文本:
abc123abc
def456def
ghi789ghi
如果在按住Ctrl-v键的同时将光标放在1上,按两次j键向下移动两列,然后按Shift-i键,按ESC键,文本将如下所示:
abc,123abc
def,456def
ghi,789ghi
(多行插入有一点延迟,在按ESC键之前不会渲染)。这就是:norm(al)命令的作用:
:10,20 normal I,
:10,20正常I,
我用。这允许您跨多行执行插入/编辑(也称为“垂直编辑”)。我认为最简单的方法是 1) 记录一行的宏,称之为“a”;在这种情况下,一种类型 q a I,ESC j q 2) 选择要应用宏的行块 3) 使用“norm”函数在该行块上执行宏“a”,即
:“如果您已经在使用“.”多次重复上一个命令,那么我发现这是迄今为止最方便的解决方案。它允许您使用以下命令在可视块的每一行上重复上一个命令
" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>
“允许对视觉选择的每行执行一次
vnoremap.:正常。
如果您的编辑已保存在操作符中,请执行以下操作:
选择要使用可视模式应用运算符的文本
然后运行命令:norm.
谢谢。如果我想要一个相当于shift-i的值呢?也就是跳过初始空格?解释:^\(\s*\)
捕获初始空白并将其保存到寄存器中,然后您可以使用\1
读取该寄存器。很好。Ctrl-V表示大写,顺便说一句,您可以说Ctrl-Shift实际上是Ctrl-V或Ctrl-V。Vim对Ctrl-codes不区分大小写(请参阅:help Ctrl-{char})。在搜索了一些此方法不起作用的原因后,发现是因为它使用大写字母I(shift-I)而不是I(而且,它只是ctrl-v,因为ctrl-shift-v将我移到了末尾)我很好奇。他们为什么不使用不带shift键的I
呢?不带shift的I在当前位置插入。shift+I在行首插入这很有用,但也有局限性,因为
在视觉模式下按行操作。我想在这种情况下,视觉模式有时可以方便地选择行范围。但是,comm在这种情况下,and和宏更加灵活和强大。您的链接已断开
" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>