Selecting entire function definition in Vim

非 Y 不嫁゛ 提交于 2019-11-28 03:33:35
David Cain

As is common in Vim, there are a bunch of ways!

Note that the first two solutions depend on an absence of blank lines.

  • If your cursor is on the line with the function name, try d}. It will delete everything to the next block (i.e. your function body).

  • Within the function body itself, dap will delete the 'paragraph'.

  • You can delete a curly brace block with da}. (If you like this syntax, I recommend Tim Pope's fantastic surround.vim, which adds more features with a similar feel).

  • You could also try using regular expressions to delete until the next far left-indented closing curly brace: d/^}Enter

  • ]] and [[ move to the next/previous first-column curly brace (equivalent to using / and ? with that regex I mentioned above. Combine with the d motion, and you acheive the same effect. In addons like Python-mode, these operators are redefined to mean exactly what you're looking for: move from function to function.

How to delete the whole block, header included

If you're on the header/name, or the line before the block, da} should do the trick.

If you're below a block, you can also make use of the handy 'offset' feature of a Vim search. d?^{?-1 will delete backwards to one line before the first occurrence of a first-column opening curly brace. This command's a bit tricky to type. Maybe you could make a <leader> shortcut out of it.

Plugins

I don't do much C programming in Vim, but there are surely plugins to help with such a thing. Try Vim Scripts or their mirror at GitHub.

To delete an entire function, including its definition, such as:

function tick() {
        // ... 
}
  • Move to the line with the function name.
  • Move the cursor to the opening brace, f{ should do it, or simply $.
  • Press V%d (Visual line, move to matching pair, delete)

If your functions look like this:

function tick() 
{
        // ... 
}
  • Move to the line with the function name.
  • Press J (join the current line with line bellow. This also puts your cursor at the last character on the resulting line, {, just the one we need for the next command.)
  • Press V%d (Visual line, move to matching pair, delete.)

or

  • Move to the line with the function name.
  • Press V[Down]%d (Visual line, move one line down, move to matching pair, delete.)

You can use this shortcut to delete not only the function, also the lines between curly braces, i.e the code between if-else statements,while,for loops ,etc.

Press Shitf + v [Will get you in visual Mode] at the curly brace start/end.

Then Press ] + } i.e ] + Shitf ] - If you are in start brace.

Then Press [ + { i.e [ + Shitf [ - If you are in end brace.

Then DEL to delete the lines selected.

Use this simple way

   1.Go to the function definition 
   2.dd  - delete function definition 
   3.d    -start delete operation 
   4.shift+5(%) - delete the lines between { to }

If you are willing to install plugins vim-textobj-function will give you vif for Visual select Inside Function and vaf for Visual select A Function.

daf will delete the function, both the line with the signature and the function body ({})

The text object defined by this plugin are more specific and they don't rely on the function body being a contiguous block of text or { being placed at the first character on the line.

The drawback is that you depend on an external plugin.

The simplest and most direct way way is as follows (works anywhere inside function):

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

The complete command sequence would be v{o}d. Note that you can do other operations besides delete the same way. For example, to copy the function, use y (yank) instead of d.

If your function were separated by the blank lines, just type:

dip

which means "delete inner paragraph".

non-visual way:

d/^}/e

... delete by searching for } at line beining, including it for deletion.

without /e (not mentioned in above answers), solution is incomplete.

with /e - searching goes to end of match, so closing bracket is included, and command is well for yanking too:

y/^}/e

Another way is to go to the line of the start of your function and hit: Vj% (or V%% if your style puts the opening brace on the same line). This puts you into Visual-Line mode and the percent takes you to the matching closing brace. In the second style, the first % takes you to the opening brace on the line that you selected and the second to its matching closing brace.

Also works for parentheses, brackets, C-style multi-line comments and preprocessor directives.

See the manual for more info.

Pre-condition: be somewhere inside the function. Go to the previous closing curly bracket on the first line using

[]

Then delete down to the next closing curly bracket on the first line using

d][
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!