你能在vi / vim中的括号中抓取或删除吗?

时间:2009-01-01 20:13:30

标签: editor vim

在C:中给出这行代码:

  

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

有没有办法从第一个粗体括号中删除或抽出其匹配的括号?我想过 df),但这只会让你在9.0之后。

是否有类似的方法让vim在匹配的大括号之间抓取所有内容,而不管新行?

7 个答案:

答案 0 :(得分:178)

dib di(

它将删除光标所在的内部(...)块。

我喜欢text-object动作和选择!

答案 1 :(得分:153)

各种动议:%

% command跳转到光标下项目的匹配项。将光标定位在开口(或关闭)paren上,并使用y%进行yanking或d%删除从光标到匹配的paren的所有内容。

这是有效的,因为%是一个“动作命令”,所以它可以在vim期望这样一个命令的任何地方使用。来自: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.

默认情况下,“item”包括括号,大括号,parens,C风格注释和各种预编译语句(#ifdef等)。

您可以在Vim homepage找到“扩展%匹配”的插件。

您可以在命令模式下输入:help various-motions来阅读%及相关动作命令的文档。

对象的选择

您可以在可视模式下使用另一组动作命令来选择各种文本对象。

要解决您的具体问题,请执行以下操作:

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

假设您的光标位于^。输入以下序列以选择您要查找的零件:

v2a)

首先v进入可视模式,然后指定你想要2级别的parens。最后,a)选择“一个块”。之后,您可以使用dx删除等。

如果您不想包含外部的parens,可以改为使用“inner block”:

v2i)

有关相关命令的完整列表,请参阅:help object-select

答案 2 :(得分:28)

要删除一对括号内的所有内容,您始终可以发出di(及其派生词。

注意:

正如@porglezomb在评论中建议的那样,您可以使用a(“with with”)而不是i(“inside”)来包含括号。因此,使用da(会删除()中的所有内容,包括()

删除直接外部括号内的文字:

所以,对于这行代码

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                ^       ^
                                |       |
                                 \_______\___---> Cursor range

假设您的光标位于上述光标范围内,您可以发出以下命令:

di(   --> Deletes '5.0/9.0'
ci(   --> Substitutes '5.0/9.0'
yi(   --> Yanks '5.0/9.0'

删除第n个外括号内的文字:

要获取第n个外部括号内的所有内容,只需在上述命令之前添加n即可。因此,使用与上面相同的光标位置,

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

答案 3 :(得分:16)

您可以使用d%进行删除,y%进行yanking。

答案 4 :(得分:10)

将光标放在第一个括号上,然后按v%yv%d

答案 5 :(得分:2)

尝试ci [block-surrounder]

在您的情况下,将光标放在您高亮的2个括号之间的任意位置并尝试键:ci(

答案 6 :(得分:0)

大卫·诺曼的answer说,

将光标放在第一个括号上,然后按v%yv%d

来自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]

这意味着它将在两个括号(%)之间选择所有内容,同时以可视方式向您显示选择(v),然后选择/复制y或删除/剪切d它。 (到默认缓冲区。)

您可以使用p进行粘贴/粘贴。

回答"teach myself to fish"