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

问题描述 投票:90回答:7

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

发件人:

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。

vim vi
7个回答
168
投票

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

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

视觉选择也可以使用常规运动命令来完成。因此,要在C语言中注释整个块,可以移至大括号并键入

Ctrl

-v Shift-i / < [/ Esc

44
投票
:%s/foo/bar(&)/g

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

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

17
投票
一种方法是块选择(由sth提及)。通常,您可以使用

ctrl-V选择一个矩形区域,然后移动光标。突出显示矩形后,按

shift-I将在矩形的左侧插入字符,或者按shift-A将其附加在矩形的右侧。因此,您可以使用此技术制作一个矩形,其中包含要添加前缀的行的最左列,单击shift-I,键入前缀,然后单击转义。

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

:s/^/YOUR PREFIX/ ^是一个正则表达式(在这种情况下,是行的开头)。通过在视线模式下键入此命令,您将看到'自动插入到s之前。这意味着替换范围将是视觉选择。

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

:s:^:// :

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

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

:s/.*/PREFIX & SUFFIX/

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

BTW:注释掉代码时,您可能以后想取消注释。您可以使用可视块(

ctrl-V

)选择斜杠,然后按d将其删除,或者您可以使用替换(可能是用

shift-V进行的视线选择) )删除这样的前导斜线:

:s:// ::

6
投票

:%norm Wibar(

:%norm WEa)

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

W-转到下一个单词

i-开始插入模式

bar(-输入序列'bar('

或一行:

:%norm Wibar(

ctrl

v ESC Ea)

如果您正在运行Windows,则键入ctrl

q

而不是ctrl v

3
投票

将光标放在顶行的任意位置,然后按

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

1
投票
%s/^/<text you want to prepend>/

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.