如何在行中间插入文本到Vim中的多行?


91

说我有十行,我想在这些行中出现的某个单词之前加上文字吗?它不必在该行的开头。

从:

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)吗?

我还想要一种将//注释附加到多行的快速方法(C样式注释)。

我使用Vim / GVim 7.2。


1
C样式注释为/ * * / BCPL样式注释为//
William Pursell

Answers:


169

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

要在末尾插入,请再次按Ctrl- v,向上/向下移动以标记所有受影响的行,然后按End$以将选择范围扩展到行尾。现在,您可以按Shift- a附加在所有行的末尾,就像以前使用Shift-一样i

视觉选择也可以使用常规运动命令来完成。因此,评论一整块用C,你可以移动到左括号和类型Ctrl- - 。v % Shifti // Esc


5
仅作为补充:如果Ctrl-V不在Windows的Vim中启动可视块模式,则应改用Ctrl-Q。
Paul

3
然后答案的一个变化是在ex模式下用shift + V thenalter标记可视块::'<,'> s / ^ / prexix_text /:'<,'> s / $ / suffix_text /注意“当您按“:”时,vim会自动打印',>'。
dimba

1
要取消注释,请使用可视块(用Ctrl + V标记)。带有注释符号“ //”的列之一被标记为按“ d”以删除注释。也不要忘记C ++注释(/ ** /):)
dimba

9
值得注意的是,在Linux中,必须在将前缀应用到所有行之前退出插入模式,这是我需要从可视模式进入插入模式的资本,即Shift + I,类型前缀,转义,转义。
约书亚·恩菲尔德

6
这对腻子不起作用。当我按时i什么也没发生。当我按下时shift+i,选择消失了,但是我可以插入文本(在仅光标所在的当前位置)。
尔根·保罗(

44

为了回答您的第一个问题,下面

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

会寻找foo并用包围匹配的模式bar()。该/g会在一条线做多次。

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


我对宏有很长的回答。这更容易:-)
Brian Ramsay

您如何针对多行进行处理?一个实际的情况是,当您的代码块由需要替换的相似行组成。

看起来好像可以在所有行上正常工作...请注意:%s和/ g。
ojrac

有趣的是:%s / foo / bar(&)/ gc不能确认-'c'没有作用。.gh–

1
:和之间的文字s确定了要在哪行上进行操作。没有什么意味着当前行。 1,30表示第1至30行(包括第1行)。 '<,'>表示当前视觉选择中的线。
风铃草

17

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

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

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

:s/^/YOUR PREFIX/

^是正则表达式(在本例中为行的开头)。通过在视线模式下键入此命令,您将看到'<,'>自动插入到s之前。这意味着替换范围将是视觉选择。

额外提示:如果您的前缀包含斜杠,则可以使用反斜杠对其进行转义,或者可以在命令中使用其他标点符号作为分隔符。例如,要添加C ++行注释,我通常会这样写:

:s:^:// :

对于添加后缀,除非所有行的长度完全相同,否则替换方法通常更容易。只需将$用作模式而不是^,您的字符串将被附加而不是前置。

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

:s/.*/PREFIX & SUFFIX/

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

顺便说一句:在注释掉代码时,您可能以后想取消注释。您可以使用visual-block(ctrl-V)选择斜杠,然后按d将其删除,或者您可以使用替换(可能是用视觉效果选择的,用制成shift-V)来删除前导斜杠,如下所示:

:s:// ::

6

:救援正常!

:%norm Wibar(

:%norm WEa)

:norm(al)像键入命令一样重播命令:

W-转到下一个单词

我-开始插入模式

bar(-输入序列'bar('

或一行:

:%norm Wibar(ctrlvESCEa)

如果您使用的是Windows,请输入ctrlq而不是ctrlv


3

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

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

如果屏幕上所有内容都可见,我通常喜欢可视块模式,如果许多屏幕将开始和停止位置分开,我通常更喜欢标记。


应该m代替'设置新标记。 '用于跳转到现有标记的行。`跳到该标记的行和列。
tiktak

1

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

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

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.