繁体   English   中英

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

[英]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 ESC Ea)

如果您运行的是 Windows,则键入ctrl q而不是ctrl v

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

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

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

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

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

对于 C 风格的注释,请使用 Brian 的正则表达式答案,并匹配以$结尾的行,然后插入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM