Vim:匹配html个属性名

Vim: matching html attribute names

语法规则如下:

" #f6266e
syntax match tagOperator "\v\<\/?\w+\s*[^>]*\>" contains=tagFunction,tagFunctionDefinition
hi def link tagOperator Operator

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

产生这个:

如您所见,html 属性名称突出显示为 html 标记(eachonsubmit)。所以我添加了一个语法来修复它(将它们变成蓝色):

" #66d9ef
syn keyword tagFunction var this
syn match tagFunction "/\v\<\/?\w+\s+\w+\/?>" contained
hi def link tagFunction Define

但是没有任何反应,颜色保持不变。我什至使用了 containscontained 所以我不确定是什么问题。 tagFunction 正则表达式是否错误?

您的模式以 / 开头(也将第二个 / 转义为 \/,这不是必需的);您可能在从搜索历史记录中复制时忘记删除它们:

syn match tagFunction "\v\<\/?\w+\s+\w+/?>" contained

您可以通过首先提取模式 yi",然后将其分配给搜索寄存器 :let @/ = @@ 来轻松验证您的模式。 n 命令将跳转到下一个匹配项并(使用 :set hlsearch)突出显示所有匹配项。

进一步批评

请注意,您的 tagOperator 模式更通用,包括(由于 [^>]* 部分)任何 tagFunction 部分。这种歧义很危险,因为现在正确的匹配取决于两个 :syntax 命令的顺序。在这种情况下,我认为你可以在tagOperator中包含一个tagAttribute,并大致这样定义它:

:syn match tagAttribute "\w\+={[^}]*}" contained