如何在 Vim 中从光标删除到括号表达式的末尾?

Posted

技术标签:

【中文标题】如何在 Vim 中从光标删除到括号表达式的末尾?【英文标题】:How to delete from the cursor to the end of a parenthetical expression in Vim? 【发布时间】:2011-11-03 06:22:04 【问题描述】:

假设我在 Vim 中有这行文本:

(foo bar (baz) qux)
    ^

我的光标位于单词foobar 之间的空格上,如图所示。我经常发现,在这种情况下,我想删除外部括号表达式的整个右侧(即光标右侧),同时保持左侧完整。也就是说,我想结束:

(foo)

通常,我会使用dt)(“删除直到)”)来完成此操作,但添加嵌套括号会使事情变得复杂:该命令将留下(foo) qux)。我也可以使用d2t),但我不想手动计算嵌套括号的数量。我也可以使用di),但这会删除括号内的整个文本,留下()

是否存在具有 i- and a-modified motions 的平衡感知的 Vim 运动,它也与当前光标位置相关?

【问题讨论】:

【参考方案1】:

您可以将]) 动作与d 一起使用。

d])

【讨论】:

我不知道]);这肯定比我的解决方案更简单(但我的解决方案仍然适用于非 vim 版本的 vi)。 @Keith Thompson:您的解决方案肯定与 vi 兼容,这很好。我担心你的解决方案是它依赖于F( 找到合适的( 跳转到。我想我更愿意做df) 并重复. 然后a)。或者mxF( 然后用, 重复F 动作直到找到正确的( 然后%d`x 是的,我只是想到了一个我的解决方案不起作用的情况:( (before) foo ^ (after) )F(?(<return> 将找到 before 之前的左括号,而不是最近的包围光标位置的括号。 (我记得很多年前的 :set lisp 命令。我看到 vim 仍然有它。它有什么作用?是的,我应该 RTFM。) @Keith Thompson:set lisp 将更改一些缩进规则并允许- 作为关键字的一部分。【参考方案2】:
mxF(%d`x

分解:

mx

设置标记x(选择你喜欢的任何字母)

F(

查找上一个( 字符

%

跳转到匹配的)

d`x

从这里删除标记x

这适用于您的具体情况;我不确定它有多普遍。如果之前的( 不在当前行,请使用?(<return> 而不是F(

编辑: 我没有提到d]),因为我不知道。

我的解决方案不适用于这种情况:

( (before) foo (after) )
              ^

因为它跳回到最近的(,而不是最近的封闭(

【讨论】:

以上是关于如何在 Vim 中从光标删除到括号表达式的末尾?的主要内容,如果未能解决你的问题,请参考以下文章

vim常用快捷键

vim中,将光标移至第60行,并且删除行尾的15个字符,如何执行命令?

在 Vim/Vi 中,如何将光标移动到前一个单词的末尾?

vim 中用啥命令可以实现把光标跳到代码的最后一行????

vim命令

二:Vim常用命令