为什么ci“和ci(,ci {…performance不同?

我们都知道什么是ci" ci( ci[在日常的编辑中非常方便,我发现了一些奇怪的东西,并且检查了帮助,没有find原因。

说,我有一个文件:

 foo "target" foo 'target' foo (target) foo {target} foo [target] foo <target> 

如果我的光标在每行的开头 ,(在' f '),然后我键入ci“,ci',ci(…

cix只能使用引号(单或双),不适用于括号。 为什么他们的行为有所不同?

dixvix相同)

用–noplugin,vim 7.3进行testing

谢谢。

更新

感谢@romainl的答案。 我仍然怀疑“vim中的pair处理”

检查这个例子:

 foo "targ\"eti\" some\"thing else " 

如果我有上面这样的一行,我input“ ci" ,无论光标是在开头还是在引号之间,它都可以正常工作,看来vim确实有“pair”的概念吗?

这也许是你的配对意思?

 foo "target x some"thing else " foo (target x some(thing else ) 

我有以上两行,如果(光标在x )我键入ci"ci( ,第二行没有任何事情发生,但第一行改成:

 foo "I"thing else " (I is cursor) 

ci(ci[ci{cit以及所有其他<action>i<something> ,只有ci'ci"像他们那样工作,exception值是引号,这里不是括号。

Vim不认为引号括起来是成对的。 它有一个内部逻辑来匹配与实际对一起工作的对,但不包含引号,因此在行为上是不同的。

你不是第一个抱怨这种差异: 这是一个解决scheme ,也许你可以find其他人。

编辑

我不太了解Vim的内部知识,所以我只能在这里做出假设。

如果你问Vim做ci"尽量find一对双引号,但是双引号不是成对的:没有办法告诉"是闭合的还是与括号相反的开头的。 因此,Vim必须做出一些select。 国际海事组织(IMO),考虑到家庭其他成员如何工作,最有意义的select是假定光标位于引号之间,并从第一个到第一个从右到第一个之间select。 我只能假设这种方法在某种程度上被certificate是错误的,或者由于某种原因而不起作用,另一种方法(当前的方法)占上风。

另一种解释可能是, i<something>机制与特定子系统(可能与showmatch相同)无法正确处理引号。

无论如何,就像你一样,我发现这种差异很奇怪,我已经把它内在化了,并把我对<action>i"用法与其他人的工作方式进行了2t"ci" ,直到实际上做了2t"ci"或者某种变体而不是ci" ! 没有效率,我知道。

你读过:h a' ? 我完全忘记了自己对这个问题的“有限理解”,但是它在那里! 它说:

“只能在一行内工作,当光标开始引用时,Vim会从行首search,找出哪些引用对形成一个string。

我从中得到的是这样的:由于某些我们不了解的原因,Vim使用了另外一种匹配引号的机制,而不是其他对,这就是为什么ci"cib和朋友不同的原因。我相当肯定,这个大局看起来很像我想象的那样。

对我来说,它看起来很像是一个伪装成function的bug或限制。

如果你仍然好奇,我build议你在vim-dev上再问一个问题。