Vim语法文件与\ zs不匹配

时间:2018-03-16 14:57:42

标签: regex vim syntax f#

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

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

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

因为&#34; \ @&lt; =&#34;建构说:

  

对于速度来说,避免这种情况通常要好得多。尝试使用&#34; \ zs&#34;而是| / \ zs |。

然而,这并不起作用,

没有高分
open SomeModule  

这怎么可能?在vim中进行常规搜索(使用/)可以高亮显示&#39; SomeModule&#39;使用第一个和第二个匹配模式时。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

  

使用具有偏移的起始模式时,不允许在以下行中开始匹配的开始。突出显示可以从以下行开始。使用&#34; \ zs&#34; item还要求比赛的开始不会移动到另一条线。

非常可能@<=是最好的解决方案。