我们都知道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"和ci(,第二行没有任何变化,但是第一行变成了:
foo "I"thing else " (I is cursor)发布于 2013-02-02 01:07:33
ci(与ci[、ci{和cit以及所有其他<action>i<something>是一致的。只有ci'和ci"的工作方式是这样的。在这里,异常值是引号,而不是括号。
Vim不认为引号是成对出现的,而括号是这样做的。它有一个用于匹配对的内部逻辑,该逻辑与实际对一起工作,而不是与引号一起工作,因此行为上的差异。
你不是第一个抱怨这种差异的人:this is one solution,也许你可以找到其他人。
编辑
不幸的是,我对Vim的内部结构了解不深,所以在这里我只能做一些假设。
如果您让Vim执行ci",它会尽量找到一对双引号,但双引号不是成对的:与括号相反,无法区分"是结束的还是开始的。正因为如此,Vim必须做出一些选择。在我看来,考虑到家庭中其他成员的工作方式,最有意义的选择是假设光标位于引号之间,并从右侧的第一个到左侧的第一个进行选择。我只能假设这种方法在某些方面被证明是错误的,或者由于某种原因不起作用,而另一种方法(当前的方法)占了上风。
另一种解释可能是i<something>机制以某种方式绑定到特定的子系统(可能与showmatch相同?)无法正确处理引号。
无论如何,就像你一样,我发现这种差异很奇怪,我以某种方式将它内在化,并将我对<action>i"的使用与其他人的工作方式保持一致。到了实际执行2t"ci"或某些变体而不是ci"的程度!效率低下,我知道。
你读过:h a'吗?我完全忘记了我对这个问题的“有限理解”是从哪里来的,但它就在那里!上面写着:
“只能在一行内工作。当光标从引号开始时,Vim将通过从行首开始搜索,找出哪些引号对构成字符串。”
我从中得到的结论是:由于某些未知的原因,Vim使用另一种机制来匹配引号而不是其他对,这就是为什么ci"不同于cib和朋友。根本原因尚不清楚,但我相当确定,总体情况看起来很像我想象的那样。
对我来说,它看起来很像是一个bug或伪装成一个特性的限制。
如果你仍然好奇,我建议你在vim-dev上提出任何进一步的问题。
发布于 2021-11-13 09:33:55
使用%
" 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 "双变单"
endif
exec "normal ci'"
endfunc类似于:
d' y' v'
https://stackoverflow.com/questions/14650788
复制相似问题