Vim重复在单词末尾添加内容

7

在vim中,我经常需要给我的源代码标识符添加后缀,并使用“.”将其重复到其他标识符上。

例如,将以下内容转换为:

foo bar baz faz

to:

foo_old bar_old baz_old faz_old

我希望能够做到以下几点:

ea_old<ESC>w.w.w.

替代方案:

ea_old<ESC>wea_old<ESC>wea_old<ESC>wea_old<ESC>

换句话说,我想让在单词末尾添加文本的操作在历史记录中显示为可重复执行的命令。有人知道如何做吗?
我可以执行以下操作:
nmap <C-a> ea

为了在单词末尾创建一个更方便的附加方式,但它只重复了“a”。理想情况下,我希望能够重复整个“eaarbitrarytext”序列。

我已经安装了repeat.vim插件并进行了一些调整,但我不太了解vimscript的操作方法。

澄清需求:我想要能够使用任意移动命令跳转,直到光标停留在标识符的某个位置,然后按“.”重复添加后缀。上面的示例是特殊情况。


1
或者您可以执行以下命令::g/foo/s//&_old/g - Julian
@Julian 那样做无法捕捉到barbazfaz。要让它都捕捉,唯一的方法是:1)匹配单词边界,或2)将你要查找的每个单词都包含在正则表达式中。解决方案1似乎不能解决OP的问题(他可能不想在每个单词中添加_old),解决方案2会变得相当冗长。 - Tim Pote
@Julian,除非您在搜索和替换中使用c标志进行单词边界。请参见我的编辑答案。 - Tim Pote
你能澄清一下需求吗?我假设你想选择一个变量并对其进行操作,然后可能再选择另一个变量。你可能需要将搜索锚定到仅查找完整的单词。 - Julian
谢谢大家的回复;我已经澄清了需求。抱歉我的一行示例给人留下了误导性的印象。 - Andrew Wagner
另一种解释是: 您可以在A;的行末添加分号;<ESC> 然后移动到其他行并使用.重复。我希望对于单词也能有相同的行为,但没有单键“追加到单词末尾”的命令。 - Andrew Wagner
3个回答

9

ea_oldESCe.e.e.应该适用于您。

另一个可能的解决方案是在搜索和替换命令中使用c标志:

:.s/\<[[:alnum:]]\+\>/&_old/gc

然后您只需要按下 y 键来确认每个替换。如果您有很多替换需要做并且想要手动确认每一个,那么这样会更快。另一方面,如果您想在每个单词后面添加_old,则可以删除c
:.s/\<[[:alnum:]]\+\>/&_old/g

1
那只在当前行起作用(我相信你已经知道了)。 - Julian
@Julian 是的,我认为这就是 OP 想要的,因为他似乎正在寻找 ea_old<ESC>wea_old<ESC>wea_old<ESC>wea_old<ESC> 的替代方案。 - Tim Pote
感谢回复;我正在寻找更通用的东西;如上所述,我已经澄清了。 - Andrew Wagner

9
我猜测原帖作者使用了一个非常简单的例子来说明一个更普遍的问题,该问题可以重新表述为“我想要轻松地重复一个任意大的命令序列”。
为此,有一个名为q命令。选择您喜欢的寄存器进行记录,比如 "q",然后: qq — 开始录制
(在此执行任何复杂的操作...) q — 停止录制 @q — 播放录制
由于我自己在编程时经常使用这个功能,所以我最终将上述操作映射到我的键盘上的F2F3F4键。这样就可以通过一个按键来重复您的一系列操作。在 .vimrc 文件中:
nmap <F2> qq
nmap <F3> q
nmap <F4> @q

感谢您的回复;这是目前为止最接近的。这更加通用,但您需要有远见,在第一次附加之前和之后按F1和F2,然后按F3重复,而不是通常的“。”。 - Andrew Wagner
我通常避免使用F1键,因为它会打开终端的帮助窗口,但这只是一个细节。此外,有时候使用复制-粘贴一行(包含数字)后跟Ctrl+A可以是一个非常省时的方法。 - Balint

1
针对这个特定的情况,您可以使用搜索和替换:s/ /_old /g

很好。这实际上是我在浏览此帖子时正在寻找的内容。但是,如果这些单词只是一行中的一部分,您还可以添加\%V以将其应用于先前在可视模式下突出显示的文本::s/\%V /_old /g - MrUser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接