Vim - 对于重复字符的搜索行为令人困惑

3

假设我有一行文本,其中有重复的字符,并且我的光标位于该行的开头,例如:

[=]===================

如果我运行/=,光标后面的=符号会被突出显示,这是预期的结果。
=[=]==================

然而,如果我搜索/==,我会期望:
=[==]=================

但是我得到的却是

==[==]================

同样地,对于 /===,我会期待...
=[===]================

但是我得到的是:
===[===]==============

有人能解释这种行为吗?这是一个错误还是设计如此?

编辑

当向后搜索时,我发现了更奇怪的行为。假设我的光标就在那一行下面:

?=:(期望的结果)

===================[=]

?==: (expected)

==================[==]

?===: (expected)

=================[===]

?====: (意外)

===============[====]==

?=====: (意外)

============[=====]===

?======:(期望结果)

==============[======]

?=======: (意外的)

============[=======]=

?========:(意外的)

======[========]======

我真的很想听一下这种行为的解释。


1
这是有意为之的。寻找下一个模式出现的起始位置是在上一个出现结束的地方开始的。这样做是出于效率考虑。 - Sato Katsura
除了这种情况,"下一个出现从光标后的下一个出现开始"的行为是否与此不同?如果您能在答案中更详细地阐述vim的行为,我会接受它。 - Kvass
这是我所知道的所有语言中的通用做法。 - Sato Katsura
1个回答

2

确实有些奇怪。Vim似乎是从行首开始寻找匹配项,然后将匹配项与光标位置进行比较。

12[3]212321

现在你想要到达第五个位置,你需要查找 12321。 这行文字中的第一个匹配项在第1个位置。
[12321]2321

由于第五个位置上的1已经用于第一次匹配,所以vim将不会看到该匹配项。

1232[12321]

在您的情况下,使用来自/===
[=]===================

在这一行中,第一个匹配项将被跳过,光标会跳到第二个匹配项。

===[===]==============

编辑: 向后搜索也将从行的开头计算匹配项。 当您有一个20个字符的字符串时

====================

回顾一下,?=== 会从行的开头开始匹配:

=== === === === === === ==

并且会匹配

=== === === === ===[===]==

匹配仍然从左到右进行,因此您在这里找不到一个苹果:

reversed elppa

啊,我明白了。在光标不在该行时,对于向后搜索的不规则行为是否有解释?我知道这是对原问题的编辑,但它似乎更加令人困惑。 - Kvass
(不确定这是否是 Vim 的默认行为,还是某个插件或我的 vimrc 文件的结果,尽管我认为我没有任何真正应该干扰搜索的插件。) - Kvass
你的反向搜索似乎有错别字。前面的例子是一行上有20个“=”,后来变成了21个。最后搜索6个字符的“======”似乎给出了8个字符的匹配“[========]”。 - Walter A
谢谢,我会回去修正错别字。 - Kvass
顺便提一下,我使用20个字符来缩短打字的时间,并且因为我认为这不会影响任何事情,但我正在测试具有跨越78个字符的“=”行的帮助文档。 - Kvass
非常有趣的解释。谢谢!我想在相反的情况下,当我在测试78个字符时发布20个字符确实很重要。 - Kvass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接