在Vim中搜索并替换多行模式

Dim*_*hev 2 vim replace

我有一个像这样的功能

myFunction (
  myStruct_1_Ptr *var1, /* commenty */
  myStruct_2_Ptr *var2, /* commenty */
  myStruct_3_Ptr *var3, /* commenty */
  int info1,
  int info2,
  int info3,
  int info4
)
Run Code Online (Sandbox Code Playgroud)

比我在包装结构中移动所有这些信息,我想让它看起来像

myFunction (
  myStruct_1_Ptr *var1, /* commenty */
  myStruct_2_Ptr *var2, /* commenty */
  myStruct_3_Ptr *var3, /* commenty */
  myStruct_4_Ptr *var4  /* This is where all infos went in */
)
Run Code Online (Sandbox Code Playgroud)

该函数由类似的语法调用,只需删除前面的语法即可.

myFunction (
  var1, /* commenty */
  var2, /* commenty */
  var3, /* commenty */
  var4  /* This is where all infos went in */
);
Run Code Online (Sandbox Code Playgroud)

我如何通过搜索和替换(或其他任何东西)来做到这一点?我在这里只写一种生活只在两个地方,在相应的声明部分.c.h文件,但我想我调用该函数的所有地方做同样.赋予函数的变量名称都是相同的.

S&R的另一种方法可能是在多个文件的所有函数实例上执行宏,但我不确定如何做到这一点.

Tom*_*ock 6

如果它是一个没有嵌套parens的简单函数调用,那么你可以使用替换命令来完成它,如下所示:

:%s/\(myFunction\_s*(\(\_[^,]*,\)\{3}.*\_s*\)\_[^)]*/\1var4\r/
Run Code Online (Sandbox Code Playgroud)

然后你可以在所有打开的缓冲区中执行:bufdo此操作,但这是非常具体的,并且附带大量关于没有嵌套括号的警告,没有逗号是注释,我确信其他大多数情况都无法正常工作.

关键是\_扩展字符类和.匹配换行符.