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

前端 未结 7 979
难免孤独
难免孤独 2020-12-07 07:43

Given this line of code in C:

printf(\"%3.0f\\t%6.1f\\n\", fahr, ((5.0/9.0) * (fahr-32)));

相关标签:
7条回答
  • 2020-12-07 08:15

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

    0 讨论(0)
  • 2020-12-07 08:17

    Try ci[block-surrounder]

    In your case, place the cursor anywhere between the 2 parenthesis that you highlighed and try the keys: ci(

    0 讨论(0)
  • 2020-12-07 08:18

    What about dib or di(.

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

    I love text-object motions and selections!

    0 讨论(0)
  • 2020-12-07 08:21

    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.

    0 讨论(0)
  • 2020-12-07 08:32

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

    0 讨论(0)
  • 2020-12-07 08:36

    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".

    0 讨论(0)
提交回复
热议问题