如何将文本在中间行插入VIM中的多行?

如何将文本在中间行插入VIM中的多行?,vim,vi,Vim,Vi,假设我有十行,我想在这些行中出现的单词前加上文本?它不必位于行的开头 发件人: 致: 是否也可以不仅在条(前加上foo),而且实际上在foo周围加上bar(foo) 我还想用一种快速的方法将/注释附加到多行(C风格的注释) 我使用Vim/GVim 7.2来回答您的第一个问题,如下所示 :%s/foo/bar(&)/g 将查找foo,并用bar()环绕匹配的图案。/g将在一行中多次执行此操作 由于您只是在匹配foo,您可以执行一个简单的:s/foo/bar(foo)/g。但是,如果您决定

假设我有十行,我想在这些行中出现的单词前加上文本?它不必位于行的开头

发件人:

致:

是否也可以不仅在
条(
前加上
foo),而且实际上在
foo周围加上
bar(foo)

我还想用一种快速的方法将
/
注释附加到多行(C风格的注释)


我使用Vim/GVim 7.2来回答您的第一个问题,如下所示

:%s/foo/bar(&)/g
将查找
foo
,并用
bar()
环绕匹配的图案。
/g
将在一行中多次执行此操作


由于您只是在匹配
foo
,您可以执行一个简单的
:s/foo/bar(foo)/g
。但是,如果您决定匹配正则表达式而不是简单的单词(例如
f[a-z][a-z]
),上述操作将起作用。上面的“&”表示您已匹配的内容。

对于C风格的注释,使用Brian的regexp答案,匹配行尾
$
,然后插入。

转到第一个
foo
,按Ctrl-v进入可视块模式,向下按,直到标记了
foo
的所有行。然后按Shift-i到in在(块的)开头插入。完成并按Esc键后,插入的字符将添加到标记块左侧的每一行

若要在末尾插入,请再次按Ctrl-v,上/下移动以标记所有受影响的行,然后按end或$将选择延伸到行的末尾。现在可以按Shift-a在所有行的末尾追加,就像之前使用Shift-i一样


视觉选择也可以使用普通移动命令完成。因此,要用C注释整个块,可以移动到大括号中,然后键入Ctrl-v%Shift-i//Esc。

要为一组行添加前缀,我使用两种不同的方法之一:

一种方法是区块选择(由sth提及)。通常,您可以使用ctrl-V和光标移动来选择矩形区域。高亮显示矩形后,按shift-I将在矩形的左侧插入字符,或按shift-a将在矩形的右侧附加字符。因此,您可以使用此技术制作包含最左侧colu的矩形mn要加前缀的行,点击shift-I,键入前缀,然后点击escape

另一种方法是使用替换(如Brian Agnew所述)。Brian的替换将影响整个文件(命令中的%表示“所有行”)。要仅影响几行,最简单的方法是点击shift-V(这将启用可视行模式)在第一行/最后一行,然后移动到最后一行/第一行。然后键入:

:s/^/YOUR PREFIX/
^是一个正则表达式(在本例中,是行的开头)。通过在可视行模式下键入它,您将看到“另一种可能性(在您的测试用例中可能不太有用,但在其他情况下很方便)是用标记将要更改的区域隔开

  • 将光标放在顶行的任意位置,然后按“a”
  • 将光标放在最后一行的任意位置,然后按“b”
  • 发出命令:'a,'b s/foo/bar(&)/
如果屏幕上的所有内容都可见,我通常喜欢视觉块模式,如果启动和停止被许多屏幕隔开,我通常更喜欢标记。

:正常救援

:%norm Wibar(

:%norm WEa)

:norm(al)重放命令,就像键入命令一样:

W-转到下一个单词

i-启动插入模式

bar(-键入序列“bar”()

或者在一行中:

:%norm Wibar(
ctrlvESC
Ea)


如果您正在运行Windows,请键入ctrlq而不是ctrlv。

另一个简单的正则表达式是:

%s/^/<text you want to prepend>/
%s/^//

关于宏,我有一个很长的答案。这要简单得多:-)如何处理多行?一个实际的例子是,当你有一个由类似行组成的代码块时,需要进行这种替换。它看起来确实可以跨所有行工作…注意:%s和/g。有趣的是:%s/foo/bar(&)/gc未确认--“c”无效。
s
之间的文本确定了它在哪些行上操作。没有任何内容表示当前行。
1,30
表示第1行到第30行(包括第1行和第30行).
“只是一个补充:如果Ctrl-V不能在Windows上的Vim中启动可视块模式,则应使用Ctrl-Q。then答案的一个变体是用shift+V标记可视块,然后在ex模式下更改块::'要取消注释,请使用可视块(用Ctrl+V标记)。带有注释符号“/”的列被标记为按“d”删除注释。不要忘记C++注释(/**):值得注意的是,在Linux中,在前缀应用于所有行之前,我必须退出插入模式,这是我从视觉模式进入插入模式所需的大写字母,即Shift+I,键入前缀,escape,escape。这对putty不起作用。当我按下
I
时,什么都不会发生。当我按下
Shift+I
时,选择消失t我能够插入文本(在光标仅位于当前位置)。C样式注释是/**/BCPL样式注释是//Related:at Vim SEIt应该是
m
,而不是
,以设置新标记。
用于跳到现有标记的行。
`
跳到该标记的行和列。
:s/^/YOUR PREFIX/
:s:^:// :
:s/.*/PREFIX & SUFFIX/
:s:// ::
%s/^/<text you want to prepend>/