4

我已经广泛搜索了这个问题的答案,但我在任何地方都找不到。我想用一行(使用搜索和替换)或其他命令替换功能块中的所有代码。我还希望能够为整个文件中的多个功能执行此操作。

我有一个这样的代码块......

{
一些代码
更多代码......
许多随机代码行
}

我想用一行代码替换花括号内的所有内容,例如:

{
return STATUS_OK;
}

我尝试过类似的东西,

%s/^{_[^}]+/\treturn STATUS_OK;/g

但这停在第一个 } 而不是行首的第一个 } 处。

我试过这个

%s/^{_[^^}]+/\treturn STATUS_OK;/g

为了在行首的第一个 } 处停止,但这由于某种原因不起作用。有任何想法吗?谢谢。

4

5 回答 5

5

这个正则表达式匹配最外层的卷曲而不考虑函数名:

 %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
于 2013-11-06T15:37:08.697 回答
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;
}

我希望这是你正在寻找的。

于 2013-11-06T15:26:18.500 回答
2

Vim 有一个很好的文本对象,称为“内部块”,由iBor调用i{。此文本对象表示 a{及其匹配的}。所以一个块或在这种情况下是一个功能块。

iB文本对象与:globaland:normal命令相结合,您可以进行文本更改的简短工作。

:g/{$/norm ciBreturn STATUS_OK;

解释

  • :g/{patter}/{cmd}全局命令 ,将在任何行匹配模式上:g运行命令,{cmd}{pat}
  • :normal或者:norm简而言之,执行普通命令。

如需更多帮助,请参阅:

:h :g
:h :norm
:h iB
于 2013-11-06T16:25:00.387 回答
0

我会用一个宏来做:

  1. 在寄存器“a”中提取文本“返回 STATUS_OK”
  2. 找到所有 {
  3. 开始录制宏
  4. 转到下一个{
  5. vi{
  6. 粘贴寄存器的内容
  7. 重复宏
于 2013-11-06T15:22:55.803 回答
0

这是一个内置的。

/^{/
Vi{C

在行首找到 { 你知道,V是“视觉选择行”,i{是“大括号内”,C 你知道。

于 2013-11-06T16:18:12.400 回答