4

これが私がこれまでに得たものです:

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 つの問題があります。

  1. @typeは強調表示されていません。明らかにグループを指定していないため、それを取得しましたが、親コンテナから色を継承することを期待していましたcfg_DocTag
  2. もちろん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番目のケースでは、グループが指定されていないのに強調表示されており、これは予想外であり、キーワードとしてはまったく一致しないように感じます. そして、可能な限り単純なテスト ケースで簡単に証明できます。

  1. ハイライト作品:

    syntax match Test '@type'
    
    highlight default link Test Keyword
    
  2. 強調表示が機能しない:

    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強調されていないのですか?何か案は?

4

1 に答える 1