vim - 搜索并替换一个函数

时间:2014-07-23 01:55:59

标签: vim replace

我想以下列方式替换一个函数。

Old function :
old_func(a,b,c)

New function :
new_func(b,a,c)

如何用new_func替换old_func并处理参数(在vim中)?

3 个答案:

答案 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)

一次完成这项工作将很困难。如果总是具有相同的参数ab,那么你可能会为它写一个正则表达式(或宏,就像已经建议的那样),但我假设事实并非如此,你在不同的地方有不同的表达方式。

我的解决方案将依赖于我的sideways.vim插件。基本上,首先用old_func替换new_func,然后绕过所有用法并使用插件交换这两个参数。

为方便起见,我还使用了我的另一个插件writable_search,它将所有搜索结果放在一个缓冲区中。如果你将它们放在一个缓冲区中,那么用宏来自动化参数交换也很容易。

如果:SidewaysRight命令映射到s>,则该过程为:

  • 使用/old_func(
  • 在缓冲区中搜索功能
  • 开始使用qq
  • 录制宏
  • 更改功能名称,例如cwnew_func<esc>
  • 使用f(l
  • 转到第一个参数
  • 执行侧向动作s>
  • 使用n
  • 转到下一场比赛
  • 使用q
  • 停止宏

现在,执行@q将转到下一场比赛并执行操作。