我今天才刚刚发现 Vimscript 的存在,所以如果这个问题比看起来更基础,请原谅我,但我在一天的大部分时间里一直在努力寻找这个问题的答案。
我正在 vim 中处理一个文件,我必须在其中执行大量重复操作。例如,我的文件看起来像这样:
firstname
secondname
thirdname
fourthname
fifthname
sixthname
...
该列表一直在继续,我想做的是将固定字符串附加到每行的末尾,以便每行以递增的数字结尾,即:
firstname = _first1
secondname = _first2
thirdname = _first3
fourthname = _first4
fifthname = _first5
sixthname = _first6
...
我知道我可以编写一个简短的 bash 脚本来解决这个问题,但我一直被使用 vimscript 在 vim 中完成这一切的前景所吸引,这是我想获得的一项技能。到目前为止,我已经设计出一个在 vim 命令模式下运行的函数:
:let i=1 | g/name/s//\=i/ | let i=i+1
这看起来很有希望,因为结果大部分都是我想要的:
first1
second2
third3
fourth4
fifth5
sixth6
...
但无论我如何尝试修改它,我都无法让它打印一个字符串(= _first),后跟递增的数字。比如这个...
:let i=1 | g/name/s//name = _first\=i/ | let i=i+1
产生这个。
firstname = _first=i
secondname = _first=i
thirdname = _first=i
fourthname = _first=i
fifthname = _first=i
sixthname = _first=i
...
和这个...
:let i=1 | execute 'g/name/s//name = _first' . i . '/' | let i=i+1
产生这个。
firstname = _first1
secondname = _first1
thirdname = _first1
fourthname = _first1
fifthname = _first1
sixthname = _first1
...
我尝试过其他组合,但目前我几乎是在黑暗中摸索。我尝试的所有操作似乎要么得到一个没有字符串的递增变量,要么得到一个带有静态变量的字符串。我怎样才能用 vimscript 做到这一点?
编辑:
我向 Ingo Karkat 提供了正确的答案,因为它直接引导我找到了解决问题的方法。对于后代,这是我最终使用的代码:
:let i=1 | 1156,1271g/$/s//\=' = _first' . i/ | let i=i+1
生产:
firstname = _first1
secondname = _first2
thirdname = _first3
fourthname = _first4
fifthname = _first5
sixthname = _first6
...
我的代码(特定于项目)中唯一的细微差别是它仅在第 1156 行到第 1271 行上运行,并且它附加到该行末尾而不替换任何文本。
答案1
一旦你使用子替换特殊,用 引入\=
,一切都必须是 Vim 表达式;您不能在前面/附加文字替换文本。因此,您的静态文本必须编码为字符串,并与以下内容连接.
:
:let i=1 | g/name/s//\='_first' . i/ | let i=i+1