您可以在vi / vim中的括号之间抓取或删除吗?


128

鉴于C中的这一行代码:

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

有没有一种方法可以从第一个粗体括号删除或取消匹配其对应的括号?我想到了df),但这只会使您在9.0之后。

是否有一种类似的方法可以使vim抓住匹配的花括号之间的所有内容,而不管换行符是什么?

Answers:


167

各种动作:%

%命令跳转到光标所在项目的匹配项。将光标放在开始(或关闭)括号上,并y%用于拉动或d%删除光标到匹配的括号中的所有内容。

这是有效的,因为%它是“运动命令”,因此可以在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.

默认情况下,“项目”包括方括号,花括号,括号,C风格的注释和各种预编译器语句(#ifdef,等等)。

您可以在Vim主页上找到用于“扩展%匹配”的插件。

%通过:help various-motions在命令模式下输入,可以阅读有关运动命令和相关运动命令的文档。

对象选择

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

要解决您的特定问题,您可以执行以下操作:

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

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

v2a)

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

如果您不想包含外部括号,则可以使用“内部块”代替:

v2i)

请参阅:help object-select以获取相关命令的完整列表。


谢谢!我知道在匹配项目之间进行%切换;不知道它在命令中是否也有用。+1并被接受。
rom09年

5
有趣的是,我一直认为它的a意思是“周围”而不是“ a”。感觉像是对“内在”的更好补充。似乎没有一天不去学习有关Vim的新知识。
Andrew Marshall

217

dib或呢di(

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

我喜欢文本对象的运动和选择!


10
幸运的是,这个问题是我用google搜索时的第一个热门问题-我不知道这个答案为我节省了多少次。我总是忘记它……:-(
康拉德·鲁道夫

16
是否可以删除包括括号的内容?(是的,我回答了我自己的问题:dab=>删除一个块(包括它的括号))
bantic年

5
我投票。另外,如果您想更正括号内的单词,请执行ciw
开发人员MariusŽilėnas15年

5
+1!最近发现文本对象运动时,我感到非常震惊!不再尝试将光标定位在正确的位置以
拉动

36

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

注意 :

就像@porglezomb在他的评论中建议的那样,您可以使用a(“连同”)代替i(“内部”)来包含括号。因此,使用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
您应该添加一个注释,a作为与之对应的注释i,因为这可能会帮助很多人。
porglezomp

@romandas这应该是公认的问题。我今天一直在寻找完全相同的问题,@ Kevin是唯一提供正确答案的问题。当然,我可以“滥用” %该问题,但是这需要更多时间,并且我认为,仅应将其用于更复杂的情况。删除特定范围内的内容正是针对该用例di的。
daniel451 '18

19

您可以d%用于删除和y%撤销。


3
%是“匹配的括号,方括号或大括号”的运动说明符。任何运动规范都可以与d和y(以及许多其他东西)配对。
混乱

10

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


3
大!%跳到匹配的paren。因此,您甚至可以使用d%和y%。

1
还要注意,“ d%”可以从函数名称的开头开始,并将删除整个函数调用。它也适用于“ {}”,“ []”甚至“ <>”对。
乔纳森·莱夫勒

@Leffler,谢谢你的提示!很高兴知道%也可以在可视模式下工作。
斯特拉格

3

尝试ci [block-surrounder]

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


几乎。经过测试,看起来光标需要在第一个括号内,而不是在两个括号之间,并且'c'是change命令。在光标位于左括号,“二(”删除到匹配右括号和“义(”猛拉。
理查德尼什

ci一直为我工作。我需要做的就是确保光标位于那些需要删除的文本周围的括号之间。
贾斯汀·阮

2

正如大卫·诺曼(David Norman)的回答

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

来自http://vimdoc.sourceforge.net/htmldoc/vimindex.html的说明:

在普通模式下标记字符注释动作        
-------------------------------------------------- ----------------------------
| v | v启动逐字可视模式
|%| %1在上找到下一个(卷曲/方括号)括号
                                       这条线,去匹配,或者去
                                       匹配的注释括号,或转到匹配
| d | [“ x] d {motion} 2删除Nmove文本[进入缓冲区x]

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

您可以使用粘贴p

做出这个回答是“自学钓鱼”


注意:vimdoc.sourceforge.net是从vim.org链接的,vim.org是vim于2015
。– n611x007
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.