-1

现在我有一个如下所示的文本文件:

{
    int fun(int a, int b    // match begin this line
       int c) {
       if (a == 0) {
          a = 1;
       } else {
          a = -1;
       }
       return 0;
    }    // mathc end this line
}

{
    int funNoMatch(int a, int b
       int c) {
       return 0;
    }
}

如何使用 vim 正则表达式匹配 vim 中的整个 fun() 函数?

我可以使用以下正则表达式匹配行,直到 fun() 函数的左大括号:

/^ int fun\_[^{]*{

但是...直到 fun() 函数的右括号之前,我无法匹配行。

我也可以使用"\_",但在这种情况下无法使用。

我只想匹配fun()函数,而不希望匹配funNoMatch

我想通过 vim regex 在 Vim 中匹配它们。

谁能帮助我?

笔记:

您可以假设函数的开头和结尾具有相同的缩进级别。

一些好朋友给了我一些其他的方法来解决我的问题,谢谢,但我也想知道 RegEx 是否可以通过相同的缩进级别做同样的事情

4

2 回答 2

2

正则表达式似乎不是正确的工具。以下是使用宏的方法:

qq        " start recording in register q
/fun(<CR> " jump to next fun(
ma        " create mark a here
/{<CR>    " jump to next {
%         " jump to closing }
d'a       " delete from here to mark a
q         " stop recording

完成后,您只需要执行该宏100(或任意数量)次

100@q

宏的一个好处是它们在会话之间保存,所以如果你以后需要做那个体操,@q仍然会在那里为你服务。


另一个“一次性”解决方案是使用我心爱的:global:normal命令:

:g/fun(/norm! ma/{^M%d'a

^M插入<C-v><CR>


将宏和 结合起来:global,我们可以得到一个非常酷的工具:我们使用:global匹配fun(并应用与函数名称无关的宏。让我们看看……</p>

首先,我们将光标定位在fun(一行上,我们如何做并不重要。

然后,我们录制宏:

qq        " start recording in register q
ma        " create mark a here
/{<CR>    " jump to next {
%         " jump to closing }
d'a       " delete from here to mark a
q         " stop recording

然后,我们将宏应用于每一行匹配fun(

:g/fun(/norm! @q

下一次,比赛可能是foobar(什么,你只需要做:

:g/foobar(/norm! @q

没有太多的打字,没有太多的思考,瞬间……很好。


剪切所有这些函数并将它们粘贴到另一个缓冲区中遵循相同的逻辑:

:g/fun(/norm! ma/{^M%"Xd'a
:tabnew
"xp

我们将所有函数附加到x寄存器(使用大写X的),在新选项卡中打开一个新的空缓冲区并粘贴x寄存器的内容。

于 2013-06-11T05:55:09.240 回答
0

以下是删除名称包含的所有函数的方法RemoveThisFunction

nnoremap Q /RemoveThisFunction<CR>0v/{<CR>%d

使用上面的方法,你可以打Q很多次,直到你所有的功能都消失了……

如果您需要更多帮助,您必须告诉我们如何找到要删除的功能。


如果您可以假设光标已经在函数的开头,您可以执行以下操作...

创建一个按 触发的映射FF

:nnoremap FF v/{<CR>%

映射将执行以下操作:

 -  enter visual mode
 -  search for the next brace
 -  go to the matching brace

* 您可以d在 map 命令的末尾添加一个以实际删除文本...


如果您想使用最后一个搜索模式来查找匹配的文本,您可以执行以下操作:

:nnoremap EE //<CR>0v/{<CR>%

换句话说:

 -  find the last search term
 -  go there  (get to the start of the function)
 -  go to the beginning of the line
 -  enter visual mode
 -  find the next brace
 -  go there
 -  move to the matching close brace

将选择函数开头的所有文本(在可视模式下)。

您可以在 map 命令的末尾添加一个d以删除实际文本。

于 2013-06-11T02:37:44.450 回答