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

VIM-如何在一组单词的开头和结尾添加2个字符

  •  0
  • Marcel  · 技术社区  · 1 年前

    我想在一定数量的单词周围加上 ** 使用单个命令,而不使用替换( %s... )。

    例如,我想 foo bar baz 变成 **foo bar baz** 只需一个命令。我只想替换光标所在的引用。

    我知道插件“环绕”(现在就测试它),但我想确保没有本地方法可以做到这一点。

    我也可以用以下方法来完成:

    :%s/foo bar baz/**%**
    

    但我想知道是否可以用一个命令快速完成以下操作:

    1. 将光标放在第一个单词的开头
    2. 插入 **
    3. 转到第三个单词的末尾
    4. 插入 **

    谢谢

    1 回复  |  直到 1 年前
        1
  •  2
  •   romainl    1 年前

    首先,这是行不通的:

    :%s/foo bar baz/**%**
    

    因为 % 只是字面意思 % 在这里你可以重复使用整个匹配 :help s/\& :help s/\0 以下为:

    :%s/foo bar baz/**&**
    :%s/foo bar baz/**\0**
    

    因为它可以在其他地方进行更换,这不是你想要的。

    用其他文本包围某些任意文本的规范方法是:

    1. 更改文本,
    2. 插入周围文本的前半部分,
    3. 插入原始文本,
    4. 插入周围文本的后半部分,
    5. 离开插入模式。

    在这样的情况下,如果没有内置的运动来完全覆盖你想要环绕的文本,它看起来是这样的:

    v{motion}c**<C-r>"**<Esc>
    

    您第一次选择的位置 foo bar baz ,然后将其包围。

    在其他情况下,当存在拟合运动时,视觉选择是不必要的:

    c{motion}**<C-r>"**<Esc>
    

    看见 :help c , :help i_ctrl-r :help registers

    如果你好奇的话,我把 a list of native ways to do what Surround does 。“带文本环绕”在没有环绕的情况下是可行的,但复杂性和脆弱性迅速增长,即使没有进入更复杂的场景。

    说真的,只要使用环绕即可。