如何将 vimscript 变量和字符串插入 vim 搜索和替换

如何将 vimscript 变量和字符串插入 vim 搜索和替换

我今天才刚刚发现 Vimscript 的存在,所以如果这个问题比看起来更基础,请原谅我,但我在一天的大部分时间里一直在努力寻找这个问题的答案。

我正在 vim 中处理一个文件,我必须在其中执行大量重复操作。例如,我的文件看起来像这样:

    firstname
    secondname
    thirdname
    fourthname
    fifthname
    sixthname
    ...

该列表一直在继续,我想做的是将固定字符串附加到每行的末尾,以便每行以递增的数字结尾,即:

    firstname = _first1
    secondname = _first2
    thirdname = _first3
    fourthname = _first4
    fifthname = _first5
    sixthname = _first6
    ...

我知道我可以编写一个简短的 bash 脚本来解决这个问题,但我一直被使用 vimscript 在 vi​​m 中完成这一切的前景所吸引,这是我想获得的一项技能。到目前为止,我已经设计出一个在 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

相关内容