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

17

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

(foo bar (baz) qux)
    ^

当光标位于单词 foobar 之间时,我经常发现在这种情况下,我希望删除外部括号表达式的整个右侧(也就是光标右侧),同时保留左侧。也就是说,最终需要得到:

(foo)

通常,我会使用dt)(“删除到)”),但嵌套的括号使事情变得复杂:该命令将使我留下(foo) qux)。我也可以使用d2t),但我不想手动计算嵌套括号的数量。我也可以使用di),但那会删除括号内的整个文本,让我只剩下()
是否有一个 Vim 运动,具有ia修饰符修改运动的平衡感知能力,也与当前光标位置有关?
2个回答

15
你可以使用d命令和])运动。
d])

我不知道 ]) 这个命令;这肯定比我的解决方案简单(但我的解决方案对于非 vim 版本的 vi 仍然有效)。 - Keith Thompson
@Keith Thompson:您的解决方案肯定是vi兼容的,这很好。我担心的是,您的解决方案依赖于F(找到适当的(进行跳转。我认为我更喜欢使用df)并重复使用.然后是a)。或者使用mxF(,然后使用,重复F运动,直到找到正确的(,然后%d`x - Peter Rincker
是的,我刚想到一个情况,我的解决方案行不通:((before) foo ^ (after))F(?(<return>将找到在before之前的左括号,而不是最靠近光标位置的括号。 (我记得很多年前有一个:set lisp命令。我看到vim仍然有它。它是做什么的?是的,我应该阅读文档。) - Keith Thompson
@Keith Thompson:set lisp会改变一些缩进规则并允许 - 作为关键字的一部分。 - Peter Rincker

3
mxF(%d`x

拆分一下:

mx

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

F(

查找前面的(字符。

%

跳转到匹配的 )
d`x

删除从此处到标记x

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

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

我的解决方案对于这种情况不起作用:

( (before) foo (after) )
              ^

因为它会跳回到最近的(而不是最近的包含(

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接