这是我到目前为止所得到的:
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
组之后的下一个字词。所以我做了以下事情:
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
继承颜色。 / LI>
Type
颜色而不仅仅是@type
之后的单词,我再次得到它,因为我指定cfg_Comment
是{{1}的容器}}。我知道问题源于何处,但我不知道如何优雅地解决它们并尽可能少地编写样板代码。
最后,有人可以告诉我为什么
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
按照Ingo的回答,建议的解决方案确实有效。然而,对我来说有趣的是为什么这个没有?
syntax keyword Test @type
highlight default link Test Keyword
只要它有效,这个将是完美的。它使我们免于重复评论匹配,并进行自然继承。在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
之前省略@
不会改变任何方式,即继承效果保持不变。但为什么type
没有突出显示?有什么想法吗?
答案 0 :(得分:1)
你已经非常接近了。您对cfg_DocTag_type
中cfg_DocTag
的限制不起作用,因为它们都会在同一位置匹配。从前者中删除前导@
会修复它,但nextgroup=cfg_DocField_type
仍然不匹配,因为显然cfg_DocTag
的匹配结束(在标记之后)使得Vim不会应用nextgroup
。
我所做的是将cfg_DocTag_type
置于与cfg_DocTag
相同的水平,即不包含在#\s*\zs
中。只有重复前匹配syntax match cfg_Comment '#.*$' contains=cfg_DocTag,cfg_DocTag_type
syntax match cfg_DocTag '#\s*\zs[\\@]\l\+' contained
syntax match cfg_DocTag_type '#\s*\zs@type' 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_DocTag_type cfg_DocTag
highlight default link cfg_DocField_type Type
作为缺点。
@
Re 1。:不包含;只有你离开transparent
。然后,添加@
将获得继承效果。
重新“终于”:我怀疑'iskeyword'
不是:syn keyword
的一部分(默认情况下不是),但必须是{{1}}。
Protip:安装SyntaxAttr.vim - Show syntax highlighting attributes of character under cursor插件时,语法脚本开发更容易。