如何将文本在中间行插入VIM中的多行?
假设我有十行,我想在这些行中出现的单词前加上文本?它不必位于行的开头 发件人: 致: 是否也可以不仅在如何将文本在中间行插入VIM中的多行?,vim,vi,Vim,Vi,假设我有十行,我想在这些行中出现的单词前加上文本?它不必位于行的开头 发件人: 致: 是否也可以不仅在条(前加上foo),而且实际上在foo周围加上bar(foo) 我还想用一种快速的方法将/注释附加到多行(C风格的注释) 我使用Vim/GVim 7.2来回答您的第一个问题,如下所示 :%s/foo/bar(&)/g 将查找foo,并用bar()环绕匹配的图案。/g将在一行中多次执行此操作 由于您只是在匹配foo,您可以执行一个简单的:s/foo/bar(foo)/g。但是,如果您决定
条(
前加上foo),而且实际上在foo周围加上bar(foo)
我还想用一种快速的方法将/
注释附加到多行(C风格的注释)
我使用Vim/GVim 7.2来回答您的第一个问题,如下所示
:%s/foo/bar(&)/g
将查找foo
,并用bar()
环绕匹配的图案。/g
将在一行中多次执行此操作
由于您只是在匹配foo
,您可以执行一个简单的:s/foo/bar(foo)/g
。但是,如果您决定匹配正则表达式而不是简单的单词(例如f[a-z][a-z]
),上述操作将起作用。上面的“&”表示您已匹配的内容。对于C风格的注释,使用Brian的regexp答案,匹配行尾$
,然后插入。转到第一个foo
,按Ctrl-v进入可视块模式,向下按,直到标记了foo
的所有行。然后按Shift-i到in在(块的)开头插入。完成并按Esc键后,插入的字符将添加到标记块左侧的每一行
若要在末尾插入,请再次按Ctrl-v,上/下移动以标记所有受影响的行,然后按end或$将选择延伸到行的末尾。现在可以按Shift-a在所有行的末尾追加,就像之前使用Shift-i一样
视觉选择也可以使用普通移动命令完成。因此,要用C注释整个块,可以移动到大括号中,然后键入Ctrl-v%Shift-i//Esc。要为一组行添加前缀,我使用两种不同的方法之一:
一种方法是区块选择(由sth提及)。通常,您可以使用ctrl-V和光标移动来选择矩形区域。高亮显示矩形后,按shift-I将在矩形的左侧插入字符,或按shift-a将在矩形的右侧附加字符。因此,您可以使用此技术制作包含最左侧colu的矩形mn要加前缀的行,点击shift-I,键入前缀,然后点击escape
另一种方法是使用替换(如Brian Agnew所述)。Brian的替换将影响整个文件(命令中的%表示“所有行”)。要仅影响几行,最简单的方法是点击shift-V(这将启用可视行模式)在第一行/最后一行,然后移动到最后一行/第一行。然后键入:
:s/^/YOUR PREFIX/
^是一个正则表达式(在本例中,是行的开头)。通过在可视行模式下键入它,您将看到“另一种可能性(在您的测试用例中可能不太有用,但在其他情况下很方便)是用标记将要更改的区域隔开
- 将光标放在顶行的任意位置,然后按“a”
- 将光标放在最后一行的任意位置,然后按“b”
- 发出命令:'a,'b s/foo/bar(&)/
如果屏幕上的所有内容都可见,我通常喜欢视觉块模式,如果启动和停止被许多屏幕隔开,我通常更喜欢标记。:正常救援
:%norm Wibar(
:%norm WEa)
:norm(al)重放命令,就像键入命令一样:
W-转到下一个单词
i-启动插入模式
bar(-键入序列“bar”()
或者在一行中:
:%norm Wibar(
ctrlvESCEa)
如果您正在运行Windows,请键入ctrlq而不是ctrlv。另一个简单的正则表达式是:
%s/^/<text you want to prepend>/
%s/^//
关于宏,我有一个很长的答案。这要简单得多:-)如何处理多行?一个实际的例子是,当你有一个由类似行组成的代码块时,需要进行这种替换。它看起来确实可以跨所有行工作…注意:%s和/g。有趣的是:%s/foo/bar(&)/gc未确认--“c”无效。:
和s
之间的文本确定了它在哪些行上操作。没有任何内容表示当前行。1,30
表示第1行到第30行(包括第1行和第30行).“只是一个补充:如果Ctrl-V不能在Windows上的Vim中启动可视块模式,则应使用Ctrl-Q。then答案的一个变体是用shift+V标记可视块,然后在ex模式下更改块::'要取消注释,请使用可视块(用Ctrl+V标记)。带有注释符号“/”的列被标记为按“d”删除注释。不要忘记C++注释(/**):值得注意的是,在Linux中,在前缀应用于所有行之前,我必须退出插入模式,这是我从视觉模式进入插入模式所需的大写字母,即Shift+I,键入前缀,escape,escape。这对putty不起作用。当我按下I
时,什么都不会发生。当我按下Shift+I
时,选择消失t我能够插入文本(在光标仅位于当前位置)。C样式注释是/**/BCPL样式注释是//Related:at Vim SEIt应该是m
,而不是”
,以设置新标记。
用于跳到现有标记的行。`
跳到该标记的行和列。
:s/^/YOUR PREFIX/
:s:^:// :
:s/.*/PREFIX & SUFFIX/
:s:// ::
%s/^/<text you want to prepend>/