在Vim中选择整个函数定义

Jac*_*oen 48 vim select function definition

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

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

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

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

Dav*_*ain 73

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

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

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

  • 在函数体内部,dap将删除"段落".

  • 您可以删除大括号块da}.(如果您喜欢这种语法,我推荐Tim Pope的精彩surround.vim,它增加了更多具有类似感觉的功能).

  • 您还可以尝试使用正则表达式删除,直到下一个左下方缩小的大括号: d/^}Enter

  • ]][[移动到下一个/上一个第一列花括号(相当于使用/?上面提到的那个正则表达式.结合d运动,你实现相同的效果.在Python模式的插件中,这些运算符被重新定义为完全意味着你在寻找什么:从功能到功能.

如何删除整个块,包括头

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

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

插件

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

  • “ da}”不包含声明,一种简单的方法是使用视觉选择并将其转换为视觉线选择以获取整个功能:“ va} V`,然后拉动/删除“ y” /`d ` (3认同)
  • `da}`(或`daB`)是内置的Vim功能,它不需要插件(参见[`:help aB`](http://vimdoc.sourceforge.net/htmldoc/motion.html# AB)) (2认同)

Nic*_*kiy 19

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

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

如果您的功能如下所示:

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

要么

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

  • 为什么不是“Vj%d”?无需“[向下]”。 (2认同)

ece*_*ulm 6

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

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

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

缺点是您依赖于外部插件。


Man*_*san 5

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

在花括号开始/结尾按Shitf + v [ 将使您进入可视模式]。

然后按] +},] + Shitf] -如果您位于开始括号中。

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

然后按DEL键删除选定的行。


Tyl*_*den 5

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

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
Run Code Online (Sandbox Code Playgroud)

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