我试图通过在我的fsharp语法文件(来自this插件)中更改此行来获得一些效率改进:
syn match fsharpModule "\%(\<open\s\+\)\@<=[a-zA-Z.]\+"
至
syn match fsharpModule "\%(\<open\s\+\)\zs[a-zA-Z.]\+"
因为“\ @ <=”构造上的文档声明:
为了速度,通常要避免这种情况要好得多。尝试使用“\ zs”代替| / \ zs |。
但是,这不起作用,也没有高分
open SomeModule
怎么会这样?在使用第一个和第二个匹配模式时,在vim中进行常规搜索(使用/)会突出显示“相同模块”。
在Vim docs for the \@<=
construct中,使用\zs
的示例省略了使用\@<=
在等效模式匹配中出现的括号。我只是猜测,但如果您尝试以下语法匹配会发生什么?
syn match fsharpModule "\<open\s\+\zs[a-zA-Z.]\+"
这是由语法包含引起的,因为您尝试断言的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
如:help syn-mult-line
中所述,\zs
在语法命令中有一些限制:
使用具有偏移的起始模式时,不允许在以下行中开始匹配的开始。突出显示可以从以下行开始。使用“\ zs”项也要求匹配的开始不会移动到另一行。
所以@<=
很可能是最好的解决方案。