Vim语法文件与\ zs不匹配

问题描述 投票:4回答:3

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

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

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

因为“\ @ <=”构造上的文档声明:

为了速度,通常要避免这种情况要好得多。尝试使用“\ zs”代替| / \ zs |。

但是,这不起作用,也没有高分

open SomeModule  

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

regex vim syntax f#
3个回答
2
投票

Vim docs for the \@<= construct中,使用\zs的示例省略了使用\@<=在等效模式匹配中出现的括号。我只是猜测,但如果您尝试以下语法匹配会发生什么?

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

1
投票

这是由语法包含引起的,因为您尝试断言的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

0
投票

:help syn-mult-line中所述,\zs在语法命令中有一些限制:

使用具有偏移的起始模式时,不允许在以下行中开始匹配的开始。突出显示可以从以下行开始。使用“\ zs”项也要求匹配的开始不会移动到另一行。

所以@<=很可能是最好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.