59

近一个星期以来,我一直在尝试使用 Vim 进行任何文本编辑工作。我想知道选择 C ​​函数定义的最快方法。

例如,如果我有这样的功能:

void helloworlds( int num )
{
    int n;
    for ( n = 0; n < num; ++n ) {
        printf( "Hello World!\n" );
    }
}

我怎样才能删除包括函数名在内的整个定义?

4

13 回答 13

91

在 Vim 中很常见,有很多方法!

请注意,前两个解决方案取决于没有空行。

  • 如果您的光标在函数名称所在的行上,请尝试d}. 它将删除下一个块的所有内容(即您的函数体)。

  • 在函数体内,dap将删除“段落”。

  • 您可以使用 删除花括号块da}。(如果你喜欢这种语法,我推荐 Tim Pope 的出色的环绕.vim,它添加了更多具有类似感觉的功能)。

  • 您也可以尝试使用正则表达式删除,直到下一个最左缩进的右花括号:d/^}Enter

  • ]][[移动到下一个/上一个第一列花括号(相当于使用/and?与我上面提到的那个正则表达式。结合d运动,你会得到相同的效果。在像Python-mode这样的插件中,这些运算符被重新定义为准确的意思你在找什么:从一个功能转移到另一个功能。

如何删除整个块,包括标题

如果您在标题/名称或块之前的行上,da}应该可以解决问题。

如果你在一个块之下,你也可以利用 Vim 搜索的方便的“偏移”特性。d?^{?-1将向后删除到第一次出现第一列左花括号之前的一行。这个命令输入起来有点棘手。也许你可以用<leader>它做一个捷径。

插件

我在 Vim 中没有做太多的 C 编程,但肯定有插件可以帮助完成这样的事情。在 GitHub 上尝试Vim Scripts或他们的镜像。

于 2012-07-30T14:10:17.763 回答
27

删除整个函数,包括其定义,例如:

function tick() {
        // ... 
}
  • 移动到函数名称所在的行。
  • 将光标移动到左大括号,f{应该这样做,或者干脆$.
  • V%d(视觉线,移动到匹配对,删除)

如果您的函数如下所示:

function tick() 
{
        // ... 
}
  • 移动到函数名称所在的行。
  • J(当前行与下面的行连接起来。这也会将光标放在结果行的最后一个字符上,{, 正是我们下一个命令所需的那个。)
  • V%d(视觉线,移动到匹配对,删除。)

或者

  • 移动到函数名称所在的行。
  • V[Down]%d(视觉线,下移一行,移动到匹配对,删除。)
于 2013-11-26T22:57:28.007 回答
7

如果您愿意安装插件,vim-textobj-function将为您vif提供 Visual select Inside Function 和vafVisual select A Function。

daf将删除函数,包括签名行和函数体 ( {})

这个插件定义的文本对象更具体,它们不依赖于函数体是一个连续的文本块或{放置在行的第一个字符处。

缺点是您依赖外部插件。

于 2015-02-09T17:36:18.487 回答
5

您可以使用此快捷方式不仅删除函数,还可以删除大括号之间的行,即 if-else 语句、while、for 循环等之间的代码。

在花括号开始/结束处按Shitf + v [Will get you in visual Mode]。

然后按] + }] + Shitf ] - 如果您在开始大括号中。

然后按[ + {[ + Shitf [ - 如果您在大括号中。

然后 DEL 删除选中的行。

于 2013-11-06T14:36:52.737 回答
4

使用这种简单的方法

   1.Go to the function definition 
   2.dd  - delete function definition 
   3.d    -start delete operation 
   4.shift+5(%) - delete the lines between { to }
于 2014-01-17T06:36:36.680 回答
4

最简单和最直接的方法如下(在函数内的任何地方工作):

v   enter visual mode
{   move to first brace in function (may have to press more than once)
o   exchange cursor from top to bottom of selection
}   extend selection to bottom of function
d   delete selected text

完整的命令序列将是v{o}d. 请注意,除了删除之外,您还可以执行其他操作。例如,要复制函数,请使用y(yank) 而不是d.

于 2014-10-13T20:58:36.560 回答
3

如果您的函数由空行分隔,只需键入:

dip

这意味着“删除内部段落”。

于 2018-09-07T16:06:30.390 回答
1

另一种方法是转到函数开头的行并点击:(Vj%或者V%%如果您的样式将左大括号放在同一行)。这会让您进入 Visual-Line 模式,百分比会将您带到匹配的右大括号。在第二种样式中,第一个 % 将您带到您选择的行上的左大括号,第二个将您带到与其匹配的右大括号。

也适用于圆括号、方括号、C 风格的多行注释和预处理器指令。

有关更多信息,请参阅手册

于 2016-06-27T21:00:23.737 回答
1

前提条件:在函数内部的某个地方。使用

[]

然后使用删除到第一行的下一个右大括号

d][
于 2018-06-12T11:42:04.780 回答
1

大多数发布的方法都有一两个缺点。通常,在处理某些面向对象语言的类定义时,函数体后面可能没有空行,因为许多代码格式化程序将最后一个方法和类的右大括号放在连续的行上。此外,您可能在函数顶部有注释。更糟糕的是,你的函数体内可能有空行。此外,您更喜欢在函数中的任何位置使用光标的方法,因为必须将其移动到特定的行或更糟的字符,需要宝贵的时间。想象一下

public class Test {

    /* ... */

    @Test
    public void testStuff() {
        // given
        doSetup();

        // when
        doSomething();

        // then
        assertSomething();
    }
}

在这种情况下,vap对您没有任何好处,因为它停在您函数中的第一个空行处。v{o}出于同样的原因。va{V更好,但没有抓住方法顶部的注释。所以在最一般的情况下我会做的是va{o{. va{选择整个函数体(警告:如果您的光标位于嵌套块内,例如内部if语句,那么您只会得到该块),o将光标放在所选内容的开头并{选择整个段落之前您的选择. 这意味着您将获得函数定义、所有注释和文档注释。

于 2020-07-06T12:04:02.613 回答
0

非视觉方式:

d/^}/e

... 通过搜索}at 行进行删除,包括删除。

没有/e(上面的答案中没有提到),解决方案是不完整的。

with /e- 搜索到匹配结束,所以包括右括号,并且命令也适合拉:

y/^}/e
于 2015-04-03T16:17:22.730 回答
0

如果您使用neovim版本:> 0.5
,现代方式是使用treesitter并构建您的模型,那么您可以是selectedor yankedor deleted...

Tree-sitter 是一个解析器生成工具和增量解析库。它可以为源文件构建具体的语法树,并在编辑源文件时有效地更新语法树

video在 youtube 上建议了这个来学习如何使用treesitter来构建你的模型:让我们使用 Treesitter 和 Lua 创建一个 Neovim 插件

于 2021-09-01T05:37:22.303 回答
0

我在这里尝试了所有最重要的答案,但除了 Nick 提出的一个建议按下f{以到达开头的花括号外,它们都不起作用。然后V%d删除整个函数。

请注意,整个函数会被拉出,因此您可以将其粘贴到其他地方。我经常遇到这个用例,尤其是在将if块移动到另一个用例时。

于 2022-02-06T07:44:45.127 回答