如何在VIM中添加搜索条件并简化函数括号格式替换?
VIM函数括号空格统一格式的优化方案
需求说明
需要把以下函数声明里括号前后的空格统一成「( 」和「 )」的格式:
原始代码:
int myFoo(int) ; int myFoo ( int) ; int myFoo ( int ); int myFoo ( int );
期望输出:
int myFoo ( int ); int myFoo ( int ); int myFoo ( int ); int myFoo ( int );
目前已用四组VIM命令实现:
:g/ *(/s//\ (/g :g/( */s//\( /g :g/ *)/s//\ )/g :g/) */s//\)/g
针对你问的两个问题,解答如下:
一、VIM搜索时如何添加匹配条件?
VIM的全局搜索可以通过正则的上下文断言或范围限定来添加匹配条件,避免误替换其他场景的括号:
1. 用正则断言限定匹配上下文
比如只想匹配函数名后的左括号(不碰if(、for(这类语句里的括号),可以用反向预查:
:g/\k\@<= *(/s// (/g
这里\k\@<=表示括号前面必须是单词字符(字母、数字、下划线),精准定位函数名后的左括号。
如果要匹配带参数的左括号,避免空括号,可以加正向预查:
:g/ *( *\w\@=/s// (/g
\w\@=表示括号后面必须跟着单词字符(参数名/类型)。
2. 限定替换的行范围
如果只想处理特定行的内容,可以在:g前加行号范围:
:1,4g/ *(/s// (/g " 只在第1到4行执行替换
也可以结合语法高亮分组,比如针对C语言的函数标识符匹配:
:g/\%#identifier\s*(/s// (/g
二、更简便的替换方法
不用写四组命令,用1-2次全局替换就能搞定:
方法1:分两次替换(清晰易理解)
先统一左括号格式:
:%s/\v(\w+)\s*\(\s*/\1 (/g
解释:
\v开启「非常魔法模式」,简化正则语法(\w+)捕获函数名,用\1保留原内容\s*\(\s*匹配函数名后任意空格+左括号+任意空格- 替换成
\1 (,即函数名+空格+左括号
再统一右括号格式:
:%s/\v\)\s*/ )/g
解释:匹配右括号后的任意空格,替换成右括号+空格。
方法2:利用自动格式化(适合整文件规范)
如果是C/C++代码,开启VIM的自动格式化:
:set formatoptions+=q
然后用gggqG格式化整个文件,VIM会自动调整函数括号的空格格式(需要开启C语法高亮支持)。
内容的提问来源于stack exchange,提问作者BobiBobObana
相关产品推荐
相关产品推荐

