Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Vim中的多行上重复编辑?_Vim - Fatal编程技术网

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

如何在Vim中的多行上重复编辑?,vim,Vim,我知道在Vim中,我通常可以通过简单地在命令前面添加一个数字来重复命令。例如,可以通过以下方式删除5行: 5dd 例如,通常还可以指定要应用命令的行范围 :10,20s:hello:goodbye:gc 如何执行“垂直编辑”?例如,我想在给定范围内每行的行号(跳过空格,即在命令模式下Shift-I后键入逗号)处插入一个特定符号,比如逗号。如何才能做到这一点(不必求助于停机期停机期停机期)?:10,20s/^/,/ 或使用宏,通过以下方式录制: q a i,ESC j h q 用于: @a 说

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

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>