使用正则表达式删除vim中的函数体

时间:2014-01-08 19:13:46

标签: regex vim

在Vim中,如何使用正则表达式删除所有函数的主体?

PHP中的示例:

function myfunc($arg1, $arg2) {
  $x = 1;
  while ($x < 10) {
    echo 'abcd';
    $x++;
  }
  return $x;
}

4 个答案:

答案 0 :(得分:3)

您可以使用以下命令删除所有功能的主体:

  

:g / function / normal jdi}

以下是正常命令

的说明
  

JDI}

  1. 假设光标位于函数的第一行。
  2. 按j键向下移动1行。
  3. 按di}删除paranthesis内的块。
  4.   

    g / searchterm / normal normal_command

    对搜索词的所有匹配执行正常命令,可以使用上述方法。

答案 1 :(得分:0)

这是一种方式

d/^}/e<Enter>

这将删除直到行

开始的下一个}(包括)

如果您想要包含结尾}的整行,可以按如下方式进行调整

d/^}/+0<Enter>

答案 2 :(得分:0)

仅使用正则表达式可能有点困难。但是,使用宏很容易。

首先,找到所有开头的大括号:

:map q /^function.*^V^[f{

在此宏中,“^ V”是control-V,用于转义输入的下一个控制字符,可能是“Esc”(转义字符)或用于提交搜索模式的换行符。我更喜欢使用显示为“^ [”的转义。但是请注意,搜索模式开头的“^”是文字“^” - 一个插入字符...“f {”只是“找到光标后面的行上给出的下一个字符”。在这种情况下,找到“{”。

在编辑模式下反复点击“q”键尝试此操作。它应该将光标移动到每个PHP函数的左括号。

现在,使用“d%”删除函数体,即“删除匹配的括号/括号/括号”。这可以添加到新宏:

:map Q qd%

在编辑模式下点击“Q”现在将依次删除每个功能体。

要将此宏应用于文件中的每个“行”,请使用:

:%norm Q

在编辑模式下使用“u”来消除您或我所犯的任何错误......

答案 3 :(得分:0)

您确定要使用正则表达式吗?对于单个函数,我将从function行开始,使用 $ 移动到行尾, v 进入(字符方式)可视模式,转到匹配的括号,然后c{}<Esc>替换它。如果您愿意,可以将结束括号放在新行上。简而言之,$v%c{}<Esc>

如果要对文件中的所有功能执行此操作,请尝试

:g/^\s*function\>/execute "normal! $v%c{\n}\<Esc>"

我假设任何以“function”(和可选的前导空格)开头的行都会启动一个函数,并且左括号位于该行的末尾。如果您的代码格式不是那么统一,那么您必须更加努力;你可以用正则表达式做什么限制!

我使用:execute以避免使用非ASCII字符,并且我将添加到:normal命令,以防万一我不想要的映射触发。 \n是可选的。

如果你真的想单独使用正则表达式,那么我希望你在第一列中永远不会有一个右括号,除非它正在关闭一个函数。像

这样的东西
:g/^function\>/+,/^}$/-d

应该这样做。

也许整个函数是缩进的(例如,因为它是一个类方法)。假设开始和结束行缩进相同,那么你可以捕获前导空格,但它会很混乱。您不能简单地使用反向引用,因为这两种搜索模式是独立的。