繁体   English   中英

Vim:在代码库中更改函数的调用签名

[英]Vim: change a function's call-signature througout the code-base

我正在使用ctags和static-analysis / autocompletion / etc插件(例如vim-jedi,youcompleteme等)将Vim慢慢变成我的IDE选择。 但是我还没有发现可以完成一项特定任务的任何东西:

说我有一个函数(我将在这里使用Python):

def my_function(outFile, foo, bar):
  outFile.write(foo[bar])

后来我更改了其签名,因此outFile位置参数是一个命名的:

def my_function(foo, bar, outFile=None):
  if outFile is None:
      outFile = getDefaultOutfile()
  outFile.write(foo[bar])

现在,我想更改所有旧的调用,尽管整个代码库都没有:

my_function(oF, f, b)

my_function(f, b, outFile=oF)

在Vim(或其他Linux utils,例如sed)中,有没有简便的方法可以做到这一点? 我知道PyCharm等可以做到这一点,但我还不打算跳船。

您可以在正则表达式替换之后执行此操作:

:s/\vmy_function\((\w*), (\w*), (\w*)\)/my_function(\2, \3, outfile=\1)/g

阅读vimregex ,特别是捕获组。 基本上,任何(\\w*)匹配项都将被保存并命名为\\1 (然后是\\2\\3等),供我们稍后使用。

值得注意的是,此方法适用于您的示例,但如果有多余的空格或缺少空格,则将不起作用。 为了使它更可靠,您可以将其更改为:

:s/\vmy_function\((\w*),\s*(\w*),\s*(\w*)\)/my_function(\2, \3, outfile=\1)/g

另一种find (如先前的注释所述),也可以使用grep打开包含所需功能的文件:

vim `grep -l 'my_function' *py`

文件将被加载到不同的缓冲区中。 然后使用常规缓冲区替换:

bufdo %s/\(my_function\)(.*)/\1(f, b, outFile=oF)/gc

此处的c标志是可选的,但我建议您进行此特殊替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM