Selecting entire function definition in Vim
Solution 1
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.
Solution 2
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.)
Solution 3
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.
Solution 4
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.
Solution 5
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
.
Jacky Boen
Updated on February 08, 2022Comments
-
Jacky Boen over 2 years
I've been trying Vim for any text editing work for almost a week now. I want to know the fastest way to select a C function definition.
For example, if I have a function like this:
void helloworlds( int num ) { int n; for ( n = 0; n < num; ++n ) { printf( "Hello World!\n" ); } }
How would I be able to delete the whole definition including the function name?