在Vim中选择整个函数定义

问题描述 投票:45回答:10

我已经为Vim进行了近一周的文本编辑工作了。我想知道选择C函数定义的最快方法。

例如,如果我有这样的函数:

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

我怎样才能删除整个定义,包括函数名称?

function vim select definition
10个回答
66
投票

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

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

  • 如果光标位于带有函数名称的行上,请尝试d}。它将删除下一个块(即您的函数体)的所有内容。
  • 在函数体内,dap将删除'paragraph'。
  • 您可以使用da}删除花括号块。 (如果您喜欢这种语法,我推荐Tim Pope的奇妙surround.vim,它增加了更多具有类似感觉的功能)。
  • 您还可以尝试使用正则表达式删除,直到下一个最左边缩进的结束大括号:d / ^}输入
  • ]]和[[移动到下一个/前一个第一列花括号(相当于使用/?和我上面提到的那个正则表达式。结合d运动,你实现相同的效果。像Python-mode这样的插件,这些operators are redefined准确地表示您正在寻找的东西:从功能到功能。

How to delete the whole block, header included

如果你在标题/名称或块之前的行,da}应该这样做。

如果你在一个区块之下,你也可以使用Vim搜索的方便的“偏移”功能。 d?^ {? - 1将在第一次出现第一列开口大括号之前向后删除一行。键入此命令有点棘手。也许你可以制作一个<leader>捷径。

Plugins

我在Vim中没有做太多的C编程,但肯定有插件可以帮助解决这个问题。试试Vim Scripts或他们的mirror at GitHub


0
投票

前提条件:在函数内部。使用,转到第一行的上一个结束花括号

[]

然后使用删除到第一行的下一个结束花括号

d][

17
投票

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

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

如果您的功能如下所示:

function tick() 
{
        // ... 
}
  • 移动到具有函数名称的行。
  • J(用线波纹管加入当前行。这也将光标放在结果行的最后一个字符{上,这是我们下一个命令所需的那个字符。)
  • V%d(视线,移动到匹配对,删除。)

要么

  • 移动到具有函数名称的行。
  • V[Down]%d(视线,向下移动一行,移动到匹配对,删除。)

5
投票

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

在大括号开始/结束处按Shift + v [将以可视模式进入]。

然后按] +} i.t] + Shift] - 如果你在开始大括号。

然后按[+ {i.t [+ Shift [ - 如果你在结束括号中。

然后DEL删除选中的行。


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 }

3
投票

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

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


3
投票

如果您愿意安装插件,vim-textobj-function将为您提供vif用于Visual选择Inside Function和vaf for Visual选择A Function。

daf将删除该功能,包括签名行和功能体({}

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

缺点是你依赖外部插件。


1
投票

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

dip

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


0
投票

非视觉方式:

d/^}/e

...通过在行beining搜索}来删除,包括删除。

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

/e - 搜索结束比赛,所以包括右括号,并且命令也适合于yanking:

y/^}/e

0
投票

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

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

有关更多信息,请参阅manual

© www.soinside.com 2019 - 2024. All rights reserved.