簡體   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