我怎样才能在Vim的行中添加文本到多行?

假设我有十条线,而且我想在这些线上出现一些字的文字? 它不一定要在行的开始。

从:

sdfsd foo sdfsd sfsd foo fsdf sdfsdf foo sdfsdf 

至:

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

是否也可以不仅预先安排bar(但实际上包围foobar(foo)

我还想要一个快速的方法来追加//多条评论(C风格的评论)。

我使用Vim / GVim 7.2。

转到第一个foo ,按Ctrlv进入视觉模块模式,并按下,直到所有与foo的行被标记。 然后按Shift插入(块的开始)。 完成后按Esc ,插入的字符将被添加到标记块左侧的每一行。

要在最后插入,再按Ctrlv ,向上/向下移动以标记所有受影响的行,然后按End$将select范围扩展到行尾。 现在你可以按Shifta来追加所有行的末尾,就像以前用Shifti一样

视觉select也可以用正常的移动命令来完成。 因此,要在C中评论一个完整的块,你可以移动到大括号,然后inputCtrlv Shifti / / Esc

回答你的第一个问题,下面

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

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

既然你只是匹配foo ,你可以做一个简单的:s/foo/bar(foo)/g 。 但是,如果你决定匹配一个正则expression式而不是一个简单的单词(例如f[az][az] ),上面的方法就行得通了。 上面的'&'代表你所匹配的。

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

一种方法是块select(由…提到)。 一般来说,你可以用ctrl-Vselect一个矩形区域,然后用光标移动。 一旦你突出显示一个矩形,按shift-I将在矩形的左侧插入字符,或者shift-A将它们追加到矩形的右侧。 所以你可以使用这种技术来制作一个矩形,包括你想要前缀的行最左边的一列,点击shift-I ,input前缀,然后点击转义。

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

 :s/^/YOUR PREFIX/ 

^是一个正则expression式(在这种情况下,行的开始)。 通过在视觉线模式下input,你会看到自动插入s之前的'<,'>。 这意味着替代的范围将是视觉select。

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

 :s:^:// : 

为了添加后缀,replace方法通常更容易,除非所有行的长度完全相同。 只需使用$而不是^,而您的string将被附加,而不是预先填写。

如果你想同时添加一个前缀和一个后缀,你可以这样做:

 :s/.*/PREFIX & SUFFIX/ 

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

顺便说一句:在注释代码的时候,你可能会想稍后取消注释。 你可以使用visual-block( ctrl-V )来select斜线,然后按d来删除它们,或者你可以使用一个replace(可能是用shift-V进行视觉select)去除这样的斜杠:

 :s:// :: 

:正常的救援!

:%norm Wibar(

:%norm WEa)

:norm(al)像您input的那样重放命令:

W – 进入下一个单词

我 – 开始插入模式

栏( – 键入序列“栏(”

或者在一行中:

:%norm Wibar( ctrl v ESC :%norm Wibar( Ea)

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

另一种可能性(可能在您的testing案例中不太实用,但在其他情况下很有用)是用标记封锁您想要更改的区域。

  • 把光标放在第一行的任何地方,然后按' a
  • 把光标放在最后一行的任何地方,然后按' b
  • 发出命令:'a,'bs/foo/bar(&)/

如果在屏幕上一切都可见,我通常喜欢视觉模块模式,如果开始和停止被多个屏幕分开,我通常更喜欢标记。

另一个简单的正则expression是:

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

对于C风格的评论,使用Brian的正则expression式答案,匹配$结束行,并插入。