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

时间:2012-04-11 11:03:35

标签: 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
)

我把所有这些信息都移到了一个包装结构中,我希望它看起来像

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 */
)

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

myFunction (
  var1, /* commenty */
  var2, /* commenty */
  var3, /* commenty */
  var4  /* This is where all infos went in */
);

如何通过搜索和替换(或其他任何方式)来实现?我在这里只写了声明部分,它只存在于两个地方 - 相应的.c.h文件中,但是我想在我调用函数的所有地方都这样做。赋予函数的变量名称都是相同的。

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

1 个答案:

答案 0 :(得分:6)

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

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

那么你可以用:bufdo在所有开放缓冲区中做到这一点,但这是非常具体的,并且附带大量关于没有嵌套括号的警告,没有逗号是注释,我确信其他大多数情况下它都是不行。

键是\_,它扩展了字符类,.来匹配换行符。