我试图通过更改 fsharp 语法文件中的这一行(来自this https://github.com/fsharp/vim-fsharp插件)来自:
syn match fsharpModule "\%(\<open\s\+\)\@<=[a-zA-Z.]\+"
to
syn match fsharpModule "\%(\<open\s\+\)\zs[a-zA-Z.]\+"
因为“\@
为了速度,通常最好避免这种多重。尝试使用“\zs”代替 |/\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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)