为什么ci“和ci(,ci {......表现不一样?

时间:2013-02-01 16:31:03

标签: vim

我们都知道ci" ci' ci( ci[ ...的作用。在日常编辑中非常方便。我发现了一些奇怪的东西,检查了帮助,没找出原因。

说,我有一个文件:

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

如果我的光标位于每行的开头,(在'f'上),那么我输入ci“,ci',ci(...

cix仅适用于引号(单引号或双引号),不适用于括号。他们为什么表现不同?

dixvix相同)

使用--noplugin,vim 7.3进行测试

谢谢。

更新

感谢@romainl的回答。我仍然怀疑“在vim中对配对”

检查这个例子:

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

如果我有一条如上所示的行,我输入ci",无论光标在开头还是在引号之间,它都能完美运行,似乎vim确实有“对”的想法?

这也许你对配对意味着什么?

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

我有以上两行,if(光标在x)我输入ci"ci(,第二行没有任何反应,但第一行改为:

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

1 个答案:

答案 0 :(得分:16)

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

Vim并不认为引号成对出现。它有一个内部逻辑,用于匹配与实际对配对但不与引号配对的内部逻辑,因此行为不同。

您不是第一个抱怨这种差异的人:this is one solution,也许您可​​以找到其他人。

修改

不幸的是,我对Vim的内部结构并不了解,所以我只能在这里做出假设。

如果你问Vim做ci"它会尽力找到一对双引号,但双引号不是成对的:没有办法判断"是否结束一个或与括号相反的开头。因此,Vim必须做出一些选择。 IMO,考虑到其他家庭成员如何工作最有意义的选择是假设光标在引号之间并从第一个到右边选择到第一个到左边。我只能假设这种方法在某种程度上被证明是错误的,或者由于某些原因而无法工作,而另一种方法(当前的方法)占了上风。

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

无论如何,就像你一样,我发现这种差异很奇怪,而且我已经以某种方式将其内化并将我对<action>i"的使用与其他人的工作方式保持一致。到了实际做2t"ci"或某些变体而不是ci"的程度!我知道效率低下。

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

  

“只能在一行内工作。当光标从引号开始时,Vim会通过从行首开始搜索来确定哪些引号对形成一个字符串。”

我从中得到的是:由于我们不知道的某些原因,Vim使用另一种匹配引号的机制而不是其他对,这就是ci"cib和朋友不同的原因。根本原因尚不清楚,但我相当肯定大局看起来很像我的想象。

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

如果您仍然很好奇,我建议您在vim-dev上提出任何进一步的问题。