如何在Vim中从括号外快速选择带括号的文本?

如何在Vim中从括号外快速选择带括号的文本?,vim,Vim,我知道我可以通过在正常模式下键入vi'或vi”来选择单引号或双引号内的文本。例如,光标位于字母H处: Hello "World" 我可以通过发布vi”来选择单词World 但如果将World插入括号而不是引用,则这似乎不起作用: Hello (World) 如果我的光标位于H,并且我尝试使用vi)选择World,则它不起作用。似乎唯一的方法是首先将光标移动到括号内,然后发出vi) 为什么选择括号和引号内的文本会有这种不同?在{a,i}×{(,),b}文本对象命令之间的差异

我知道我可以通过在正常模式下键入
vi'
vi”
来选择单引号或双引号内的文本。例如,光标位于字母
H
处:

Hello "World"
我可以通过发布
vi”
来选择单词
World

但如果将
World
插入括号而不是引用,则这似乎不起作用:

Hello (World)
如果我的光标位于
H
,并且我尝试使用
vi)
选择
World
,则它不起作用。似乎唯一的方法是首先将光标移动到括号内,然后发出
vi)


为什么选择括号和引号内的文本会有这种不同?

在{
a
i
}×{
b
}文本对象命令之间的差异 它们的
`
对应物主要来自 块和带引号字符串定义的差异 (请参见
:help v_ab
:help v_akote

后者是上一个引号字符的文本 当前行直到同一行上的下一行(逃逸行除外), 前者是前n个不匹配的开口之间的文本 括号和匹配的结束符。简单地说,命令
va(
(无计数)与
[(v%
)类似,如果没有不匹配的值 光标前的括号,两者均不选择任何内容。但是, 命令
va“
扫描当前行以查找匹配对 不管怎么说,都是引用

我想,造成这种行为差异的主要原因是 带引号的字符串与括号相反,假定为 非嵌套(至少在内置Vim文本对象的透视图中)

要选择当前行下一个括号中的文本,请选择 可以使用
%vi(
%va(
),具体取决于是否需要 是否分别在选择中包含括号。

有一个脚本指向假定解决该问题的脚本


未经测试,但这是Steve Losh写的,所以可能不错。

我肯定这个问题以前已经回答过了,但我找不到它!不幸的是,这个解决方案只适用于括号,而不适用于任何其他类型的括号。@Daniel:只需使用
%vi[
%vi{
%vi即可