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]#
假设我有一些代码:
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]#