Vim:匹配html属性名称

时间:2015-02-20 14:32:39

标签: regex vim

以下语法规则:

" #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

产生这个:

enter image description here

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

您可以先轻触模式yi",然后将其分配给搜索注册:let @/ = @@,轻松验证模式。然后n命令将跳转到下一个匹配项(并:set hlsearch)突出显示所有匹配项。

进一步批评

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

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