Reputation: 4226
Given this line of code in C:
printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
Is there a way to delete or yank from the first bold parenthesis to its matching parenthesis? I thought about df), but that only will get you to just after the 9.0.
Is there a similar way to get vim to grab everything between matching braces, regardless of newlines?
Upvotes: 163
Views: 91481
Reputation: 6711
To delete all that is inside a pair of parentheses, you can always issue di(
and its derivatives.
Note :
As @porglezomb suggested in his comment, you can use a
("along with") instead of i
("inside") to include the parentheses. So, using da(
deletes everything inside (
and )
including (
and )
.
Deleting text inside the immediate outer pair of parentheses :
So, for this line of code
printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
^ ^
| |
\_______\___---> Cursor range
assuming that your cursor is inside the above mentioned cursor range, you can issue the following commands :
di( --> Deletes '5.0/9.0'
ci( --> Substitutes '5.0/9.0'
yi( --> Yanks '5.0/9.0'
Deleting text inside the n-th outer pair of parentheses :
To grab everything inside the n-th outer pair of parentheses, just add n
before the above command. So, with the same cursor position as above,
2di( --> Deletes '(5.0/9.0) * (fahr-32)'
2ci( --> Substitutes '(5.0/9.0) * (fahr-32)'
2yi( --> Yanks '(5.0/9.0) * (fahr-32)'
3di( --> Deletes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3ci( --> Substitutes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3yi( --> Yanks '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
Upvotes: 52
Reputation: 9272
As answer of David Norman says,
v%y
or v%d
.Explanation from http://vimdoc.sourceforge.net/htmldoc/vimindex.html:
tag char note action in Normal mode ------------------------------------------------------------------------------ |v| v start characterwise Visual mode |%| % 1 find the next (curly/square) bracket on this line and go to its match, or go to matching comment bracket, or go to matching |d| ["x]d{motion} 2 delete Nmove text [into buffer x]
This means it will select everything between and including the two brackets (%
) while showing the selection to you visually (v
) and then yank/copy y
or delete/cut d
it. (To the default buffer.)
You can put/paste with p
.
Made this answer to "teach myself to fish".
Upvotes: 3
Reputation: 41
Try ci[block-surrounder]
In your case, place the cursor anywhere between the 2 parenthesis that you highlighed and try the keys: ci(
Upvotes: 4
Reputation: 19899
Place your cursor on the first parenthesis, then press v%y
or v%d
.
Upvotes: 11
Reputation:
The %
command jumps to the match of the item under the cursor. Position the cursor on the opening (or closing) paren and use y%
for yanking or d%
for deleting everything from the cursor to the matching paren.
This works because %
is a "motion command", so it can be used anywhere vim expects such a command. From :help y
:
["x]y{motion} Yank {motion} text [into register x]. When no
characters are to be yanked (e.g., "y0" in column 1),
this is an error when 'cpoptions' includes the 'E'
flag.
By default, "item" includes brackets, braces, parens, C-style comments and various precompiler statements (#ifdef
, etc.).
There is a plugin for "extended % matching" that you can find on the Vim homepage.
You can read the documentation on %
and related motion commands by entering :help various-motions
in command mode.
There is another set of motion commands that you can use in Visual mode to select various text objects.
To solve your specific problem you would do the following:
printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
^
Let's say your cursor is positioned at ^
. Enter the following sequence to select the part you are looking for:
v2a)
First v
enters Visual mode, then you specify that you want to go 2
levels of parens up. Finally the a)
selects "a block". After that you can use d
or x
to delete, etc.
If you don't want to include the outer parens, you can use "inner block" instead:
v2i)
See :help object-select
for the complete list of related commands.
Upvotes: 185
Reputation: 828002
What about dib
or di(
.
It will delete the inner (...) block where the cursor is.
I love text-object motions and selections!
Upvotes: 298