gpt4 book ai didi

regex - Vim 语法文件与\zs 不匹配

转载 作者:行者123 更新时间:2023-12-01 19:41:29 25 4
gpt4 key购买 nike

我试图通过更改我的 fsharp 语法文件(来自 this 插件)中的这一行来获得一些效率改进:

syn match    fsharpModule     "\%(\<open\s\+\)\@<=[a-zA-Z.]\+"  

syn match    fsharpModule     "\%(\<open\s\+\)\zs[a-zA-Z.]\+"

因为“\@<=”构造上的文档指出:

For speed it's often much better to avoid this multi. Try using "\zs" instead |/\zs|.

但是,这不起作用,并且没有突出显示

open SomeModule  

怎么会这样呢?在使用第一个和第二个匹配模式时,在 vim 中进行常规搜索(使用/)会突出显示“SomeModule”。

最佳答案

这是由语法包含引起的,并且因为 open 存在另一个语法组。您尝试断言的关键字。

在语法突出显示中,\zs只影响结果(Vim 将用语法组突出显示的内容);当涉及与其他语法组的关系时,整个模式(即包括 \zs 之前的文本)被视为匹配。 (帮助中没有明确记录此实现细节。)相比之下,肯定的后向断言 ( \%(...\)\@<= ) 既不包含在结果中,也不包含在实际匹配中。这解释了您所看到的行为差异。 (它与可选分组无关,正如 @rmunn 怀疑的那样,也与 @Sergio 的答案中的多行无关,因为 \s\+ 不允许在中间换行。)

我认为这里易于实现更重要,所以使用\@<=应该没问题。 ,尽管帮助建议 \zs 。如果您愿意完全重构语法脚本,则可以通过以下方式解决这个问题,假设有 syntax keyword fsharpOpen open某处:

syntax keyword fsharpOpen nextgroup=fsharpModule skipwhite open
syntax match fsharpModule "[a-zA-Z.]\+" contained

关于regex - Vim 语法文件与\zs 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49323753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com