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

如何在Vim中从光标删除到插入式表达式的末尾?,vim,editor,motion,Vim,Editor,Motion,假设我在Vim中有这行文本: (foo bar (baz) qux) ^ 我的光标位于单词foo和bar之间的空格上,如图所示。我经常发现,在这种情况下,我希望删除外圆括号表达式的整个右侧(即光标右侧),同时保留左侧不变。也就是说,我想以: (foo) 通常,我会使用dt)())来完成这项任务,但添加嵌套的括号会使事情变得复杂:该命令将留给我(foo)qux)。我也可以使用d2t),但我不想手动计算嵌套括号的数量。我也可以使用di),但这会删除括号内的全部文本,留下() 是否有Vim

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

(foo bar (baz) qux)
    ^
我的光标位于单词
foo
bar
之间的空格上,如图所示。我经常发现,在这种情况下,我希望删除外圆括号表达式的整个右侧(即光标右侧),同时保留左侧不变。也就是说,我想以:

(foo)
通常,我会使用
dt)
)来完成这项任务,但添加嵌套的括号会使事情变得复杂:该命令将留给我
(foo)qux)
。我也可以使用
d2t)
,但我不想手动计算嵌套括号的数量。我也可以使用
di)
,但这会删除括号内的全部文本,留下
()

是否有Vim运动与当前光标位置相关,且具有平衡意识?

您可以将
]
运动与
d
一起使用

d])
细分:

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

查找上一个
字符

%
跳转到匹配的

从此处删除以标记
x

这适用于你的具体情况;我不知道它有多普遍。如果前面的
不在当前行上,请使用
?(
而不是
F(

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

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

( (before) foo (after) )
              ^

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

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