我想以下列方式替换一个函数。
Old function :
old_func(a,b,c)
New function :
new_func(b,a,c)
如何用new_func替换old_func并处理参数(在vim中)?
答案 0 :(得分:5)
vim支持第一个捕获的组的反向引用(\1
和第二个的\2
):
%s/\<old_func(\([^,]*\),\([^,]*\),/new_func(\2,\1,/g
答案 1 :(得分:2)
我个人更喜欢宏观,因为这需要更少的脑能量。您可以录制1个编辑内容,然后根据需要进行播放。
首先搜索old_func:
/old_func<ENTER>
开始在寄存器q中录制宏:
qq
转到new_func的下一个出现并将old更改为new:
n # Next occurence
ct_ # change until '_'
new # 'new'
ESC # back to normal mode
进入括号并切换参数
f(l # find '(' and step 1 to the right
d2l # delete two characters ( 'a' and ',' )
l # move 1 place to the right
p # paste deleted characters
停止录制宏:
q
播放宏
@q # once
500@q # 500 times, it will stop if it can't find anymore occurences of old_func
如果您的参数不是a和b,那么您可以像这样切换参数:
f(l # find '(' and step 1 to the right
df, # delete the characters including the comma
f, # move to the next comma
p # paste deleted characters
答案 2 :(得分:0)
一次完成这项工作将很困难。如果总是具有相同的参数a
和b
,那么你可能会为它写一个正则表达式(或宏,就像已经建议的那样),但我假设事实并非如此,你在不同的地方有不同的表达方式。
我的解决方案将依赖于我的sideways.vim插件。基本上,首先用old_func
替换new_func
,然后绕过所有用法并使用插件交换这两个参数。
为方便起见,我还使用了我的另一个插件writable_search,它将所有搜索结果放在一个缓冲区中。如果你将它们放在一个缓冲区中,那么用宏来自动化参数交换也很容易。
如果:SidewaysRight
命令映射到s>
,则该过程为:
/old_func(
qq
cwnew_func<esc>
f(l
s>
n
q
现在,执行@q
将转到下一场比赛并执行操作。