これが私がこれまでに得たものです:
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_Commentcfg_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強調されていないのですか?何か案は?