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