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

hmae6n7t  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(159)

我想用一个命令用**包围一定数量的单词,而不使用替换(%s...)。
例如,我想用一个命令将foo bar baz转换为**foo bar baz**。我只想替换光标所在的引用。
我知道插件“surround”(正在测试),但我想确保没有本地方法可以做到这一点。
我也可以这样做:

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

但我想知道以下操作是否可以通过一个命令快速完成:
1.将光标放在第一个单词的开头
1.插入**
1.转到第三个单词的结尾
1.插入**
谢谢

rdrgkggo

rdrgkggo1#

首先,这行不通:

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

因为%在这里只是一个文字%。您可以使用:help s/\&:help s/\0重复使用整个匹配:

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

而且因为它可以在其他地方执行替换,这不是你想要的。
用其他文本包围一些任意文本的规范方法是:
1.改变文本,
1.插入周围文本的前半部分,
1.插入原始文本,
1.插入周围文本的后半部分,
1.离开插入模式。
在这种情况下,没有内置的运动来覆盖您想要包围的文本,它看起来像这样:

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放在一起了。“用文本包围”在没有Surround的情况下也是可行的,但是复杂性和脆弱性迅速增长,即使没有进入更复杂的场景。
说真的,就用环绕吧。

相关问题