在Vim中,如何使用正则表达式删除所有函数的主体?
PHP中的示例:
function myfunc($arg1, $arg2) {
$x = 1;
while ($x < 10) {
echo 'abcd';
$x++;
}
return $x;
}
答案 0 :(得分:3)
您可以使用以下命令删除所有功能的主体:
:g / function / normal jdi}
以下是正常命令
的说明JDI}
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
应该这样做。
也许整个函数是缩进的(例如,因为它是一个类方法)。假设开始和结束行缩进相同,那么你可以捕获前导空格,但它会很混乱。您不能简单地使用反向引用,因为这两种搜索模式是独立的。