これが私がこれまでに得たものです:
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
次にやりたいことは、group の後の次の単語を強調表示すること@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
これには 2 つの問題があります。
- 今
@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
グループが指定されていないため、強調表示されなくなりましたが、これは予想されることです。しかし2番目のケースでは、グループが指定されていないのに強調表示されており、これは予想外であり、キーワードとしてはまったく一致しないように感じます. そして、可能な限り単純なテスト ケースで簡単に証明できます。
ハイライト作品:
syntax match Test '@type' highlight default link Test Keyword
強調表示が機能しない:
syntax keyword Test @type highlight default link Test Keyword
アップデート
Ingo's answer に従って、提案されたソリューションは実際に機能します。しかし、私にとって興味深いのは、なぜこれがそうでないのですか?
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
しても何も変わりません。つまり、継承の効果はそのまま残ります。しかし、なぜcfg_DocField_type
強調されていないのですか?何か案は?