VIM:如何用不同的值替换字符串的每个实例

VIM: How to replace each instance of a string with a different value

假设我有一些代码:

divide(int x) {
int a = 0;
a += x;
}

subtract(int x) {
int b = 0;
b += x;
}

multiply(int x) {
int c = 0;
c += x;
}

我正在使用 VIM,我希望能够使用 vim 命令行搜索并按顺序将 += 的每个实例替换为 {'/=', '-=', '*='} . 我想使用 :%s/+=/...,但我不确定如何使用。

我也考虑过在 vim 中使用 python,就像 this 一样,但如果可能的话,我更喜欢完全在 VIM 中使用更简单的解决方案。

如果您的所有 += 出现在不同的行上:

:let c=0 | g/\m+=/ s!\m+=!\=['/=', '-=', '*='][c%3]! | let c+=1

如果同一行可能有多个+=:

:fu! Cycle() | let c+=1 | return ['/=', '-=', '*='][c%3] | endf
:let c=-1 | %s/\m+=/\=Cycle()/g

参考文献:

  • :h :global
  • :h s/\=

这是@SatoKatsura 回答的简短变体。它首先定义一个替换列表,然后使用 :help sub-replace-expression 删除列表的第一个元素。

:let replacements = ['/=', '-=', '*='] | %s#+=#\=remove(replacements, 0)#

如果有超过 3 个替换,并且您想要重复替换,请使用:

:let replacements = ['/=', '-=', '*='] | %s#+=#\=add(replacements, remove(replacements, 0))[-1]#