Vim:为什么这个高亮定义抵消了另一个?

Vim: why is this highlight definition neutralizing the other?

我构建了以下突出显示定义(感谢 问题中的回答):

" #a6e22e
syntax match tagFunctionDefinition "\v\<"
syntax match tagFunctionDefinition "\v\>"
syntax match tagFunctionDefinition "\v/"
hi def link tagFunctionDefinition Function

" #f6266e
syntax match tagOperator "\v\<\/?\zs\w+\ze\/?>"
hi def link tagOperator Operator

首先是高亮文件中的<>/。第二个突出显示 < >s.

之间的字符

出于某种原因,第一个突出显示定义中和了第二个(如果我注释掉第一个,则第二个有效)。

可能是什么原因?

(我试过调换他们的位置,但什么也没做。)

语法突出显示有点不同。特别是, \zs / \ze 部分会掩盖这些位置的匹配项,即使它们不是(突出显示的)匹配项的一部分也是如此。这就是你所看到的。一种解决方案是退回到(较慢的)前瞻/后视,但我认为这里采用不同的解决方案更合适。

就目前而言,您的 tagFunctionDefinition 也将匹配独立的 <> 字符;那可能不是你想要的。要仅在完整标记内匹配它们,请将这些语法定义为 contained:

syntax match tagFunctionDefinition "\v\<" contained
syntax match tagFunctionDefinition "\v\>" contained
syntax match tagFunctionDefinition "\v/" contained
hi def link tagFunctionDefinition Function

然后,删除匹配限制 \zs\ze,以及上面的 contains 定义:

syntax match tagOperator "\v\</?\w+/?\>" contains=tagFunctionDefinition
hi def link tagOperator Operator

备注

  • 你不需要在这里转义文字/(因为你选择的分隔符是");仅在 / 搜索中。
  • 如果您的语法与 HTML / XML 相似,请查看相应的 $VIMRUNTIME/syntax/html.vim 语法脚本以获取灵感。
  • 您对 \v 的关注是什么?在此特定示例中,它们使模式更加复杂!