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

Ken*_*ent 22 vim

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

说,我有一个文件:

foo "target"
foo 'target'
foo (target)
foo {target}
foo [target]
foo <target>
Run Code Online (Sandbox Code Playgroud)

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

cix仅使用引号(单引号或双引号)的作品不适用于括号.他们为什么表现不一样?

(dix,vix相同)

用--noplugin,vim 7.3测试

谢谢.

更新

谢谢@romainl的答案.我对"vim中的对处理"仍有疑问

检查这个例子:

foo "targ\"eti\" some\"thing else "
Run Code Online (Sandbox Code Playgroud)

如果我有一个像上面这样的行,我输入ci",无论光标是在开头还是在引号之间,它都很完美,似乎vim确实有"对"的想法?

这可能是你对配对的意思吗?

foo "target x some"thing else "
foo (target x some(thing else )
Run Code Online (Sandbox Code Playgroud)

我具有上述两行,如果(在光标x)I型ci"ci(,没有发生在第二行,但第一行改变为:

foo "I"thing else " (I is cursor)
Run Code Online (Sandbox Code Playgroud)

rom*_*inl 16

ci(是一致的ci[,ci{并且cit和所有其他<action>i<something>.只ci'ci"他们一样工作.异常值是引号,这里不是括号.

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

你并不是第一个抱怨这种差异的人:这是一个解决方案,也许你可以找到其他解决方案.

编辑

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

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

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

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

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

"只能在一行内工作.当光标在引号上开始时,Vim将通过从行的开头搜索来确定哪些引用对形成一个字符串."

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

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

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

  • 我认为部分原因是括号 ()、{}、[]、&lt;&gt; 等都嵌套了。报价不嵌套;而在类 C 语言中,引号很少能轻易跨越行边界。而不是在光标不在引号内时进行无用的搜索 Vim 决定是有用的。 (6认同)