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

给定 C 中的这行代码:

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

有没有一种方法可以从第一个粗括号中删除或者取消它的匹配括号?我考虑过 Df),但那只能让你在9.0之后。

是否有类似的方法让 vim 获取匹配大括号之间的所有内容,而不用考虑换行?

76552 次浏览

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

您可以使用 d%删除和 y%拉。

各种动议:%

%指令跳转到与光标下的项匹配。将光标放置在开始(或结束)括号上,并使用 y%进行拉取操作,或使用 d%删除从光标到匹配括号的所有内容。

这是因为 %是一个“ motion 命令”,所以它可以在 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”包括括括号、大括号、括号、 C 样式注释和各种预编译语句(#ifdef等)。

你可以在 Vim 主页上找到一个“扩展% 匹配”的插件。

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

对象-选择

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

为了解决你的具体问题,你需要做以下事情:

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

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

v2a)

首先,v进入可视化模式,然后指定要将括号的 2级别提高。最后,a)选择“ a block”。之后你可以使用 d或者 x来删除等等。

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

v2i)

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

dibdi(呢。

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

我爱 文本对象动议和选择!

试试 CI [街区包围]

在您的示例中,将光标放在高亮显示的两个括号之间的任何位置,然后尝试键: ci (

要删除一对括号内的所有内容,总是可以发出 di(及其导数。

注:

正如@porglezomb 在他的评论中建议的那样,您可以使用 a(“ along 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))'

正如大卫 · 诺曼的 回答所说,

将光标放在第一个括号中,然后按 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

答案是 “自学钓鱼”