romandas
romandas

Reputation: 4226

Can you grab or delete between parentheses in vi/vim?

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

Answers (7)

ahy1
ahy1

Reputation: 376

You can use d% for deleting and y% for yanking.

Upvotes: 22

Kevin
Kevin

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

n611x007
n611x007

Reputation: 9272

As answer of David Norman says,

Place your cursor on the first parenthesis, then press 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

Justin Nguyen
Justin Nguyen

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

David Norman
David Norman

Reputation: 19899

Place your cursor on the first parenthesis, then press v%y or v%d.

Upvotes: 11

user3850
user3850

Reputation:

Various Motions: %

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.

object-select

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

Christian C. Salvadó
Christian C. Salvadó

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

Related Questions