[英]How can I insert text in the middle of the line to multiple lines in Vim?
假设我有十行,我想在这些行中出现的某个单词前添加文本? 它不必在行的开头。
从:
sdfsd foo sdfsd
sfsd foo fsdf
sdfsdf foo sdfsdf
到:
sdfsd bar(foo sdfsd
sfsd bar(foo fsdf
sdfsdf bar(foo sdfsdf
是否也可以不仅在bar(
而且实际上用bar(foo)
包围foo
?
我还想要一种将//
注释附加到多行(C 样式注释)的快速方法。
我使用 Vim/GVim 7.2。
转到第一个foo
,按Ctrl - v进入可视块模式并按下直到所有带有foo
的行都被标记。 然后按Shift - i在(块的开头)插入。 完成后按Esc ,插入的字符将添加到标记块左侧的每一行。
要在末尾插入,再次按 Ctrl - v ,向上/向下移动以标记所有受影响的行,然后按End或$将选择扩展到行的末尾。 现在您可以按Shift - a附加到所有行的末尾,就像以前使用Shift - i 一样。
视觉选择也可以通过正常的移动命令来完成。 因此,评论一整块用C,你可以移动到左括号并按Ctrl - v%的转变- I / / ESC。
为了回答你的第一个问题,下面
:%s/foo/bar(&)/g
将寻找foo
,并用bar()
包围匹配的模式。 /g
将在一行中多次执行此操作。
因为你只是匹配foo
,你可以做一个简单的:s/foo/bar(foo)/g
。 但是,如果您决定匹配正则表达式而不是简单的单词(例如f[az][az]
),则上述方法将起作用。 上面的“&”代表您匹配的内容。
为了给一组行添加前缀,我使用两种不同的方法之一:
一种方法是块选择(由 sth 提到)。 通常,您可以使用ctrl-V和光标移动来选择一个矩形区域。 突出显示矩形后,按shift-I将在矩形的左侧插入字符,或按shift-A将它们附加到矩形的右侧。 因此,您可以使用此技术制作一个矩形,其中包含要添加前缀的行的最左侧列,点击shift-I ,输入前缀,然后点击转义。
另一种方法是使用替换(如 Brian Agnew 所述)。 Brian 的替换将影响整个文件(命令中的 % 表示“所有行”)。 要仅影响几行,最简单的方法是在第一行/最后一行上按shift-V (启用可视行模式),然后移动到最后一行/第一行。 然后输入:
:s/^/YOUR PREFIX/
^ 是一个正则表达式(在这种情况下,是行的开头)。 通过在可视行模式下键入此内容,您将看到 '<,'> 自动插入到 s 之前。 这意味着替换的范围将是视觉选择。
额外提示:如果您的前缀包含斜杠,您可以使用反斜杠将它们转义,或者您可以使用不同的标点字符作为命令中的分隔符。 例如,要添加 C++ 行注释,我通常会这样写:
:s:^:// :
对于添加后缀,除非所有行的长度完全相同,否则替换方法通常更容易。 只需使用 $ 代替 ^ 作为模式,您的字符串将被附加而不是前置。
如果要同时添加前缀和后缀,可以执行以下操作:
:s/.*/PREFIX & SUFFIX/
.* 匹配整行。 替换中的 & 将匹配的文本(整行)放回原处,但现在它将添加您的前缀和后缀。
顺便说一句:当注释掉代码时,您可能想稍后取消注释。 您可以使用视觉块( ctrl-V )选择斜线,然后按 d 删除它们,或者您可以使用替换(可能使用视线选择,使用shift-V )来删除这样的前导斜线:
:s:// ::
:正常救援!
:%norm Wibar(
:%norm WEa)
:norm(al) 重播命令,就像你输入它们一样:
W - 转到下一个单词
i - 启动插入模式
bar( - 输入序列 'bar('
或者在一行中:
:%norm Wibar(
ctrl v ESCEa)
如果您运行的是 Windows,则键入ctrl q而不是ctrl v 。
另一种可能性(在您的测试用例中可能不太有用,但在其他情况下很方便)是用标记封锁要更改的区域。
:'a,'bs/foo/bar(&)/
如果一切都在屏幕上可见,我通常喜欢视觉块模式,如果开始和停止被许多屏幕分开,我通常更喜欢标记。
另一个简单的正则表达式是:
%s/^/<text you want to prepend>/
对于 C 风格的注释,请使用 Brian 的正则表达式答案,并匹配以$
结尾的行,然后插入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.