假设我有十行,我想将文本添加到这些行中出现的某些单词?它不必在行的开头.
从:
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.
转到第一个foo
,按Ctrl- v进入视觉区块模式并按下直到foo
标记所有线条.然后按Shift- i在(块的)开头插入.完成后按Esc,插入的字符将添加到标记块左侧的每一行.
要在末尾插入,请再按一次Ctrl- v,向上/向下移动以标记所有受影响的线条,然后按End或$将选区扩展到线条的末尾.现在你可以按Shift- a添加到所有行的末尾,就像之前的Shift- 一样i.
视觉选择也可以用正常的移动命令完成.因此,要在C中对整个块进行注释,您可以移动到左大括号并键入Ctrl- v % Shift- i // Esc.
回答你的第一个问题,如下
:%s/foo/bar(&)/g
将寻找foo
并围绕匹配的模式bar()
.该/g
会在一条线做多次.
由于你只是匹配foo
,你可以做一个简单的:s/foo/bar(foo)/g
.但是,如果您决定匹配正则表达式而不是简单的单词(例如f[a-z][a-z]
),则上述操作将起作用.上面的'&'表示您的匹配.
要为一组行添加前缀,我使用两种不同的方法之一:
一种方法是块选择(由sth提及).通常,您可以选择一个矩形区域,ctrl-V然后选择光标移动.一旦您突出显示一个矩形,按下shift-I将在矩形的左侧插入字符,或shift-A将它们附加在矩形的右侧.因此,您可以使用此技术制作一个矩形,其中包含您想要前缀,命中shift-I,键入前缀的行的最左侧列,然后单击"转义".
另一种方法是使用替换(如Brian Agnew所述).Brian的替换将影响整个文件(命令中的%表示"所有行").为了影响几行,最简单的方法是shift-V在第一行/最后一行上点击(启用可视线模式),然后移动到最后/第一行.然后输入:
:s/^/YOUR PREFIX/
^是正则表达式(在这种情况下,是行的开头).通过在可视线模式下键入它,您将看到在之前自动插入.这意味着替换的范围将是视觉选择.
额外提示:如果您的前缀包含斜杠,您可以使用反斜杠转义它们,也可以使用不同的标点字符作为命令中的分隔符.例如,要添加C++行注释,我通常会写:
:s:^:// :
对于添加后缀,替换方法通常更容易,除非您的所有行都具有完全相同的长度.只需使用$作为模式而不是^,你的字符串将被附加而不是预先填充.
如果要同时添加前缀和后缀,可以执行以下操作:
:s/.*/PREFIX & SUFFIX/
.*匹配整行.&替换中的&匹配文本(整行),但现在它将添加您的前缀和后缀.
BTW:在评论代码时,您可能希望稍后取消注释.您可以使用visual-block(ctrl-V)选择斜杠,然后点击d删除它们,或者您可以使用替换(可能使用视觉线选择shift-V)来删除这样的前导斜杠:
:s:// ::
:救援正常!
:%norm Wibar(
:%norm WEa)
:norm(al)重放命令,就好像你输入了它们一样:
W - 转到下一个词
我 - 开始插入模式
bar( - 键入序列'bar('
或者在一行中:
:%norm Wibar(
ctrlvESCEa)
如果您正在运行Windows,请键入ctrlq而不是ctrlv.