为什么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
只能使用引号(单或双),不适用于括号。 为什么他们的行为有所不同?
( dix
, vix
相同)
用–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上再问一个问题。