0

我想在每个之前添加一些文本return 例如我们有:

void* foo (){
   if (something){ 
   return A;
   }
do_something;
// That return word may be ignored, because it's comment
do_something;
returns(); //It may ignored to
return ;
}

我需要 :

void* foo (){
   if (something){
   END;
   return A;
   }
do_something;
// That return word may be ignored, becouse it's comment
do_something;
returns(); //It may ignored to
END;
return ;
}

我无法为搜索请求构建正则表达式。它可能看起来像“

return "<这里有些文本以空格符号开头,或者什么都没有> ; < endline >

我如何在 VIM 中实现它?

4

5 回答 5

3

使用保持寄存器是一种简单的方法:

%s/^\(\s*\)\(return\>.*\)/\1END;\r\1\2/g

含义:

%s - global substitute
/  - field separator
^  - start of line
\( - start hold pattern
\s - match whitespace
*  - 0 or more times
\) - end hold pattern
\> - end of word boundary (prevent returns matching return)
.  - match any character
\1 - recall hold pattern number 1
\2 - recall hold pattern number 2
\r - <CR>
g  - Replace all occurrences in the line
于 2013-07-18T21:32:29.400 回答
1

您可以使用global如下命令:

:g/^\s*return\>/normal OEND;

它搜索具有任意数量的空格和单词 return 的行,执行命令O并添加“END;”

奖励功能 END;是“自动缩进”。

于 2013-07-19T09:55:18.607 回答
0

使用替换:

:%s/\(return\)/END;\r\1/g

替换搜索 的出现return,记住这些出现和位置,END;然后在这些出现的前面加上换行符。您可能想阅读 vim 替换中的正则表达式。请注意,对\(\)字符进行分组,以便可以在替换中再次引用组。

编辑

让这个例子更具体(我希望我能遇到你的极端情况):

:%s/\(return\(\((\|\s\)[^;]\)*;\)/END\r\1/g

正则表达式匹配return其后跟空格或左括号和后续字符直到;遇到的每个出现。这样的事件被其自身和前置的END.

于 2013-07-18T18:55:27.980 回答
0

:%s/.*\(\/\/.*\)\@<!\<return\>.*/END\r&/g

这基本上是说“找到任何带有return不在注释中的语句的行并将其替换为 END、换行符,然后是原始行”。这样做的关键是lookbehind ( \(\/\/.*\)\@<!),它基本上忽略return了评论中的任何实例。\<return\>确保您只搜索而return不是类似returns.

我测试使用:

//return here
return; // return as mentioned
if (cornerCase) { return 1; }
returns();
return 0;

替换后变成了这个:

//return here
END
return; // return as mentioned
END
if (cornerCase) { return 1; }
returns();
END
return 0;
于 2013-07-18T20:01:04.700 回答
0
:%s/^\(\s*\)\<return\>/\1END;\r&/

用于&返回匹配的内容。类似于\0在 Perl 中。

于 2013-07-18T22:30:57.890 回答