我试图通过更改我的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;使用第一个和第二个匹配模式时。
答案 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还要求比赛的开始不会移动到另一条线。
非常可能@<=
是最好的解决方案。