33

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

说,我有一个文件:

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

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

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

( dix,vix相同)

用 --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 )

我有上面两行,如果(光标处x)我输入ci"and ci(,第二行没有发生任何事情,但第一行改为:

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

2 回答 2

27

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和朋友。根本原因尚不清楚,但我相当肯定大局看起来很像我想象的那样。

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

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

于 2013-02-01T17:07:33.377 回答
1

利用%

" nnoremap cb cib
nnoremap cb %cib
" nnoremap vb vib
nnoremap vb %vib
nnoremap yb %yib
nnoremap db %dab

增强%
https ://github.com/andymass/vim-matchup#tocbar-dopjfd

b可以匹配( [ {
想同时'匹配'"吗?


nnoremap c' :call DoubleAsSingleC()<CR>
func! DoubleAsSingleC()
    " When [!] is added, error messages will also be skipped,
    " and commands and mappings will not be aborted
    " when an error is detected.  |v:errmsg| is still set.
    let v:errmsg = ""
    silent! :s#\"\([^"]*\)\"#'\1'#g
    if (v:errmsg == "")
        echo "双变单&quot;
    endif

    exec "normal ci'"
endfunc

类似的:
d' y' v'

于 2021-11-13T09:33:54.647 回答