Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

vim

editor

People also ask

How do I match parentheses in Vim?

The % key. You can use the % key to jump to a matching opening or closing parenthesis, square bracket or a curly brace.

How do you select and delete a line in vi?

Type Shift-v to enter linewise selection mode, then move the cursor down using j (yes, use h , j , k and l to move left, down, up, right respectively, that's much more efficient than using the arrows) and type d to delete the selection.

How do I delete specific words in vi?

Deleting a Word or Part of a Word To delete a word, position the cursor at the beginning of the word and type dw . The word and the space it occupied are removed. To delete part of a word, position the cursor on the word to the right of the part to be saved. Type dw to delete the rest of the word.


What about dib or di(.

It will delete the inner (...) block where the cursor is.

I love text-object motions and selections!


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.


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))'

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


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