我怎样才能在Vim的行中添加文本到多行?
假设我有十条线,而且我想在这些线上出现一些字的文字? 它不一定要在行的开始。
从:
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 – 我插入(块的开始)。 完成后按Esc ,插入的字符将被添加到标记块左侧的每一行。
要在最后插入,再按Ctrl – v ,向上/向下移动以标记所有受影响的行,然后按End或$将select范围扩展到行尾。 现在你可以按Shift – a来追加所有行的末尾,就像以前用Shift – i一样 。
视觉select也可以用正常的移动命令来完成。 因此,要在C中评论一个完整的块,你可以移动到大括号,然后inputCtrl – v % Shift – i / / Esc 。
回答你的第一个问题,下面
:%s/foo/bar(&)/g
将查找foo
,并用bar()
包围匹配的模式。 /g
将在一行中多次执行此操作。
既然你只是匹配foo
,你可以做一个简单的:s/foo/bar(foo)/g
。 但是,如果你决定匹配一个正则expression式而不是一个简单的单词(例如f[az][az]
),上面的方法就行得通了。 上面的'&'代表你所匹配的。
为了在一组行上加前缀,我使用了两种不同的方法之一:
一种方法是块select(由…提到)。 一般来说,你可以用ctrl-Vselect一个矩形区域,然后用光标移动。 一旦你突出显示一个矩形,按shift-I将在矩形的左侧插入字符,或者shift-A将它们追加到矩形的右侧。 所以你可以使用这种技术来制作一个矩形,包括你想要前缀的行最左边的一列,点击shift-I ,input前缀,然后点击转义。
另一种方法是使用替代(如Brian Agnew所述)。 Brian的replace会影响整个文件(命令中的%表示“所有行”)。 为了影响几行,最简单的方法是在第一行/最后一行上移动shift-V (启用视觉模式),然后移动到最后/第一行。 然后键入:
:s/^/YOUR PREFIX/
^是一个正则expression式(在这种情况下,行的开始)。 通过在视觉线模式下input,你会看到自动插入s之前的'<,'>。 这意味着替代的范围将是视觉select。
额外提示:如果您的前缀包含斜杠,您可以使用反斜杠将其转义,也可以使用不同的标点符号作为命令中的分隔符。 例如,要添加C ++行注释,我通常会写:
:s:^:// :
为了添加后缀,replace方法通常更容易,除非所有行的长度完全相同。 只需使用$而不是^,而您的string将被附加,而不是预先填写。
如果你想同时添加一个前缀和一个后缀,你可以这样做:
:s/.*/PREFIX & SUFFIX/
*匹配整行。 replace中的&将匹配的文本(整行)放回,但是现在它会添加前缀和后缀。
顺便说一句:在注释代码的时候,你可能会想稍后取消注释。 你可以使用visual-block( ctrl-V )来select斜线,然后按d来删除它们,或者你可以使用一个replace(可能是用shift-V进行视觉select)去除这样的斜杠:
:s:// ::
:正常的救援!
:%norm Wibar(
:%norm WEa)
:norm(al)像您input的那样重放命令:
W – 进入下一个单词
我 – 开始插入模式
栏( – 键入序列“栏(”
或者在一行中:
:%norm Wibar(
ctrl v ESC:%norm Wibar(
Ea)
如果您正在运行Windows,请键入ctrl q而不是ctrl v 。
另一种可能性(可能在您的testing案例中不太实用,但在其他情况下很有用)是用标记封锁您想要更改的区域。
- 把光标放在第一行的任何地方,然后按' a
- 把光标放在最后一行的任何地方,然后按' b
- 发出命令
:'a,'bs/foo/bar(&)/
如果在屏幕上一切都可见,我通常喜欢视觉模块模式,如果开始和停止被多个屏幕分开,我通常更喜欢标记。
另一个简单的正则expression是:
%s/^/<text you want to prepend>/
对于C风格的评论,使用Brian的正则expression式答案,匹配$
结束行,并插入。