首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ci“和ci(,ci{.... )表现不同?

为什么ci“和ci(,ci{.... )表现不同?
EN

Stack Overflow用户
提问于 2013-02-02 00:31:03
回答 2查看 4.5K关注 0票数 32

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

比如说,我有一个文件:

代码语言:javascript
复制
foo "target"
foo 'target'
foo (target)
foo {target}
foo [target]
foo <target>

如果光标位于每行的开头(在‘f’上),则我键入ci",ci',ci(...

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

(dixvix相同)

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

谢谢。

更新

感谢@romainl的回答。我仍然对“vim中的配对处理”持怀疑态度。

检查此示例:

代码语言:javascript
复制
foo "targ\"eti\" some\"thing else "

如果我有像上面这样的一行,我输入ci",无论光标是在开头还是在引号之间,它都能完美地工作,看起来vim确实有“配对”的概念?

也许这就是你所说的配对?

代码语言:javascript
复制
foo "target x some"thing else "
foo (target x some(thing else )

我有上面两行,如果(光标在x处)我输入ci"ci(,第二行没有任何变化,但是第一行变成了:

代码语言:javascript
复制
foo "I"thing else " (I is cursor)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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上提出任何进一步的问题。

票数 27
EN

Stack Overflow用户

发布于 2021-11-13 09:33:55

使用%

代码语言:javascript
复制
" 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可以匹配( [ {

我想使用'来匹配'"

代码语言:javascript
复制
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'

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14650788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档