我已经广泛搜索了这个答案,我无法在任何地方找到它。我想用一行(使用搜索和替换)或其他命令替换功能块中的所有代码。我还希望能够在整个文件中为多个功能执行此操作。
我有一个像这样的代码块......
{
一些代码
更多代码...
许多行随机码
}
我想用一行代码替换花括号内的所有内容,例如:
{
return STATUS_OK;
}
我尝试了类似的东西,
%s / ^ {_ [^}] + / \ treturn STATUS_OK; / g
但是这会停在第一行}而不是第一行}。在行的开头。
我试过这个
%s / ^ {_ [^^}] + / \ treturn STATUS_OK; / g
为了在第一行停在第一行}但是由于某种原因这不起作用。有任何想法吗?感谢。
答案 0 :(得分:5)
此正则表达式匹配最外层的curlies而不考虑函数名称:
%s/^{\(\(\s\+}\)\|[^}]\|\_s\)*/{\treturn STATUS_OK;/g
故障:
^{ # match a curly at the beginning of a line
\( # group these alternations.... either match
\(\s\+}\) \| # whilespace followed by a closing curly
# (to get rid of internal blocks) or ..
[^}] \| # match a non curly, or ..
\_s # match newlines and whitespaces
\)* # match the alternation as long as you can
答案 1 :(得分:2)
这是(宏)对你好吗
qq/{<cr>ci{return STATUS_OK;<esc>q
然后99@q
(命令行)
如果您喜欢:s
,请尝试:
%s/^{\zs\_.\{-}\ze}/\rreturn STATUS_OK;\r/
你的正则表达式不起作用,因为在这里你需要“全点”(\_.
)
修改强>
你发布的正则表达式仍然只匹配第一个}而不是匹配 第一个}在一行的开头。
我误解了你的要求。但修改命令以适应这一点相对容易:
%s/^{\zs\_.\{-}\ze\_^}/\rreturn foo;\r
此命令将更改:
asdfasf
{
some code
more code...
many lines of random code
} (this is not the leading one)
{
some code
more code...
many lines of random code
}
到
asdfasf
{
return foo;
}
我希望这就是你要找的东西。
答案 2 :(得分:2)
Vim有一个很好的文本对象调用“内部块”,由iB
或i{
调用。此文本对象代表{
及其匹配的}
。所以一个块或在这种情况下是一个功能块。
将iB
文本对象与:global
和:normal
命令相结合,可以简化文本更改。
:g/{$/norm ciBreturn STATUS_OK;
解释
:g/{patter}/{cmd}
全局命令:g
将在永久行匹配模式{cmd}
{pat}
:normal
或:norm
,简称执行正常命令。如需更多帮助,请参阅:
:h :g
:h :norm
:h iB
答案 3 :(得分:0)
我会用宏来做:
答案 4 :(得分:0)
这是一个内置的。
/^{/
Vi{C
查找{在您知道的行的开头,V
是“视觉上选择行”,i{
是“内部大括号”,C您知道。