如何将行中间的文本添加到Vim中的多行?

时间:2009-07-23 20:27:14

标签: vim vi

说我有十行,我想在这些行中出现的某些单词前加上文字?它不一定是在行的开头。

自:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

为:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

是否也可以不仅在bar(前加foo而在bar(foo)实际上加上//

我还想快速将{{1}}条评论附加到多行(C风格的评论)。

我使用的是Vim / GVim 7.2。

7 个答案:

答案 0 :(得分:168)

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

要在最后插入,请再次按 Ctrl - v ,向上/向下移动以标记所有受影响的行,然后按结束 $ 将选择范围扩展到行尾。现在你可以按 Shift - a 追加到所有行的末尾,就像之前的 Shift - i

视觉选择也可以使用正常的移动命令完成。因此,要在C中注释整个块,您可以移动到左括号并键入 Ctrl - v Shift - i / / Esc

答案 1 :(得分:44)

要回答您的第一个问题,请参阅下面的

:%s/foo/bar(&)/g

将查找foo,并使用bar()包围匹配的模式。 /g将在一行中多次执行此操作。

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

答案 2 :(得分:16)

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

一种方法是块选择(由sth提及)。通常,您可以使用 ctrl-V 选择一个矩形区域,然后选择光标移动。一旦你突出显示一个矩形,按 shift-I 将在矩形的左侧插入字符,或者 shift-A 将它们附加在矩形的右侧。长方形。因此,您可以使用此技术创建一个矩形,其中包含要添加前缀的行的最左侧列,单击 shift-I ,键入前缀,然后单击“转义”。

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

:s/^/YOUR PREFIX/

^是一个正则表达式(在这种情况下,是行的开头)。通过在可视线模式下输入此内容,您会看到'<,'>在s之前自动插入。这意味着替换的范围将是视觉选择。

额外提示:如果您的前缀包含斜杠,您可以使用反斜杠转义它们,也可以使用不同的标点字符作为命令中的分隔符。例如,要添加C ++行注释,我通常会写:

:s:^:// :

对于添加后缀,替换方法通常更容易,除非您的所有行都具有完全相同的长度。只需使用$代替^而你的字符串将被追加而不是预先填充。

如果要同时添加前缀和后缀,可以执行以下操作:

:s/.*/PREFIX & SUFFIX/

。*匹配整行。 &在替换中放回匹配的文本(整行),但现在它将添加你的前缀和后缀。

BTW:在评论代码时,您可能希望稍后取消注释。你可以使用visual-block( ctrl-V )来选择斜线,然后点击d删除它们,或者你可以使用替换(可能使用 shift进行视觉线选择) -V )删除这样的前导斜杠:

:s:// ::

答案 3 :(得分:6)

:正常救援!

  

:%norm Wibar(

     

:%norm WEa)

:norm(al)重放命令,就好像你输入了它们一样:

  

W - 转到下一个单词

     

i - 开始插入模式

     

bar( - 键入序列'bar('

或者在一行中:

  

:%norm Wibar( CTRL v ESC Ea)

如果您正在运行Windows,请输入 ctrl q 而不是 ctrl v

答案 4 :(得分:3)

另一种可能性(在您的测试用例中可能不那么有用,但在其他情况下很方便)是用标记封锁您想要更改的区域。

  • 将光标放在顶行的任意位置,然后按' a
  • 将光标放在最后一行的任意位置,然后按' b
  • 发出命令:'a,'b s/foo/bar(&)/

如果屏幕上的所有内容都可见,我通常喜欢视觉模式,如果开始和停止被多个屏幕分开,我通常更喜欢标记。

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

对于C风格的评论,请使用Brian的正则表达式答案,并在结尾$上匹配,然后插入。