如何在 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)
^
我的光标位于单词foo
和bar
之间的空格上,如图所示。我经常发现,在这种情况下,我想删除外部括号表达式的整个右侧(即光标右侧),同时保持左侧完整。也就是说,我想结束:
(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 中从光标删除到括号表达式的末尾?的主要内容,如果未能解决你的问题,请参考以下文章