这是我到目前为止得到的:
syntax match cfg_Comment '#.*$' contains=cfg_DocTag
syntax match cfg_DocTag '#\s*\zs[\\@]\l\+' contained
highlight default link cfg_Comment Comment
highlight default link cfg_DocTag SpecialComment
适用于以下情况:
##
# @brief The maximum.
# @type number
# @default 1
我接下来要做的是@type
用Type
group 突出显示下一个单词。所以我做了以下事情:
syntax match cfg_Comment '#.*$' contains=cfg_DocTag,cfg_DocField_type
syntax match cfg_DocTag '#\s*\zs[\\@]\l\+' contained
syntax match cfg_DocTag_type '@type' containedin=cfg_DocTag nextgroup=cfg_DocField_type skipwhite
syntax match cfg_DocField_type '\a\+' contained
highlight default link cfg_Comment Comment
highlight default link cfg_DocTag SpecialComment
highlight default link cfg_DocField_type Type
这有两个问题:
- 现在
@type
没有突出显示,我明白了,因为显然我没有为它指定组,但我希望它会从其父容器继承颜色cfg_DocTag
。 - 当然,现在评论中的所有内容都是有颜色的,而
Type
不仅仅是.@type
cfg_Comment
cfg_DocField_type
我知道问题出在哪里,但我不知道如何优雅地解决它们并编写尽可能少的样板代码。
最后,谁能告诉我为什么
syntax match cfg_DocTag_type '@type' containedin=cfg_DocTag nextgroup=cfg_DocField_type skipwhite
和
syntax keyword cfg_DocTag_type @type containedin=cfg_DocTag nextgroup=cfg_DocField_type skipwhite
不一样吗?即在第一种情况下,正如我上面描述的那样:@type
由于未指定组,因此不再突出显示,但这是预期的。但是在第二种情况下,即使没有指定组,它也会突出显示,这是出乎意料的,所以感觉就像一个关键字它根本不匹配。并且可以通过最简单的测试用例轻松证明:
突出作品:
syntax match Test '@type' highlight default link Test Keyword
突出显示不起作用:
syntax keyword Test @type highlight default link Test Keyword
更新
按照 Ingo 的回答,建议的解决方案确实有效。然而,对我来说有趣的是为什么这个没有?
syntax match cfg_Comment '#.*$' contains=cfg_DocTag
syntax match cfg_DocTag '#\s*\zs[\\@]\l\+' contained
syntax match cfg_DocTag_type '@type' transparent containedin=cfg_DocTag nextgroup=cfg_DocField_type skipwhite
syntax match cfg_DocField_type '\a\+' contained
highlight default link cfg_Comment Comment
highlight default link cfg_DocTag SpecialComment
highlight default link cfg_DocField_type Type
如果它有效,这将是完美的。它使我们免于重复注释匹配,并进行自然继承。顺便说一句,省略@
beforetype
不会改变任何东西,即继承效果保持不变。但是为什么cfg_DocField_type
没有突出显示呢?有任何想法吗?