代码之家  ›  专栏  ›  技术社区  ›  Sasha

如何将行中间的文本前置到VIM中的多行?

  •  88
  • Sasha  · 技术社区  · 15 年前

    假设我有十行,并且我想在这些行中出现一些单词前加上文本?它不必在行首。

    来自:

    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。

    7 回复  |  直到 15 年前
        1
  •  166
  •   sth Wojciech Parzych    11 年前

    走向第一 foo ,出版社 Ctrl键 - V 要进入可视块模式,请向下按,直到所有行 标记。然后按 换档 - 在块的开始插入。完成后按 ESC ,插入的字符将添加到标记块左侧的每一行。

    若要在末尾插入,请再次按 Ctrl键 - V ,向上/向下移动以标记所有受影响的行,然后按 终点 $ 将所选内容扩展到行尾。现在你可以按 换档 - 在所有行的末尾追加,就像前面 换档 - .

    视觉选择也可以通过正常的移动命令完成。因此,要在C中注释整个块,可以移动到左大括号并键入 Ctrl键 - V % 换档 - / / ESC .

        2
  •  44
  •   Brian Agnew    15 年前

    回答你的第一个问题,如下

    :%s/foo/bar(&)/g
    

    将寻找 foo ,并用 bar() . 这个 /g 将在一行中多次执行此操作。

    因为你只是在匹配 ,你可以做一个简单的 :s/foo/bar(foo)/g . 但是,如果您决定匹配正则表达式而不是简单的单词(例如 f[a-z][a-z] )上面的“&”表示您匹配的内容。

        3
  •  16
  •   Hulk1991 moinudin    11 年前

    为了给一组行加前缀,我使用两种不同的方法之一:

    一种方法是块选择(由某物提到)。通常,可以选择一个矩形区域, CTRL—V 然后是光标移动。突出显示一个矩形后,按 施瓦特I 将在矩形的左侧插入字符,或 SHIVETA 将它们附加到矩形的右侧。因此,可以使用此技术生成一个矩形,其中包含要作为前缀的行的最左边的列,单击 施瓦特I ,键入前缀,然后按Escape。

    另一种方法是使用替换(如BrianAgnew所提到的)。Brian的替换将影响整个文件(命令中的%表示“所有行”)。只影响几行,最简单的方法是点击 斯夫特V (启用可视行模式)在第一行/最后一行,然后移动到最后一行/第一行。然后键入:

    :s/^/YOUR PREFIX/
    

    ^是一个regex(在本例中是行首)。在可视行模式下键入此命令,您将看到在s前面自动插入“<,”>。这意味着替换的范围将是可视选择。

    额外提示:如果前缀包含斜杠,可以用反斜杠转义它们,也可以在命令中使用不同的标点符号作为分隔符。例如,为了添加C++行注释,我通常写:

    :s:^:// :
    

    对于添加后缀,替换方法通常更容易,除非所有行的长度完全相同。只需将$用于模式而不是^并且您的字符串将被追加而不是预挂起。

    如果要同时添加前缀和后缀,可以执行以下操作:

    :s/.*/PREFIX & SUFFIX/
    

    *匹配整行。替换中的&会将匹配的文本(整行)放回原处,但现在将添加前缀和后缀。

    顺便说一句:在注释代码时,您可能希望稍后取消对它的注释。可以使用可视块( CTRL—V )要选择斜线,然后单击d删除斜线,或者可以使用替换(可能是用视觉线条选择,用 斯夫特V )要删除这样的前导斜线:

    :s:// ::
    
        4
  •  6
  •   Cyber Oliveira    13 年前

    :救援正常!

    :%norm Wibar(

    :%norm WEa)

    :norm(al)重播命令,就好像键入了命令一样:

    W-转到下一个单词

    I-启动插入模式

    bar(-type the sequence'bar('键入序列'bar')

    或在一行中:

    %Frm Wibar CTRL V 电子稳定控制系统 Ea)

    如果您运行的是Windows,请键入 CTRL Q 而不是 CTRL V .

        5
  •  3
  •   mrk    10 年前

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

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

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

        6
  •  1
  •   Artorias2718    9 年前

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

    %s/^/<text you want to prepend>/
    
        7
  •  0
  •   maxwellb    15 年前

    对于C样式的注释,使用brian的regexp答案,并在行尾匹配 $ ,然后插入。