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

我接下来要做的是@typeTypegroup 突出显示下一个单词。所以我做了以下事情:

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

这有两个问题:

  1. 现在@type没有突出显示,我明白了,因为显然我没有为它指定组,但我希望它会从其父容器继承颜色cfg_DocTag
  2. 当然,现在评论中的所有内容都是有颜色的,而Type不仅仅是.@typecfg_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由于未指定组,因此不再突出显示,但这是预期的。但是在第二种情况下,即使没有指定组,它也会突出显示,这是出乎意料的,所以感觉就像一个关键字它根本不匹配。并且可以通过最简单的测试用例轻松证明:

  1. 突出作品:

    syntax match Test '@type'
    
    highlight default link Test Keyword
    
  2. 突出显示不起作用:

    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没有突出显示呢?有任何想法吗?

4

1 回答 1

1

你已经很接近了。cfg_DocTag_type您对in的遏制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.

Protip: 安装SyntaxAttr.vim 后,语法脚本开发更容易 - 在光标下显示字符的语法高亮属性插件。

于 2013-10-25T19:33:14.367 回答