Vim:寻求帮助来创建自定义语法突出显示

时间:2013-10-25 16:10:33

标签: syntax-highlighting vim vim-syntax-highlighting

这是我到目前为止所得到的:

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

接下来我要做的是突出显示@typeType组之后的下一个字词。所以我做了以下事情:

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继承颜色。 / LI>
  2. 当然现在评论中的所有内容都是Type颜色而不仅仅是@type之后的单词,我再次得到它,因为我指定cfg_Comment是{{1}的容器}}。
  3. 我知道问题源于何处,但我不知道如何优雅地解决它们并尽可能少地编写样板代码。

    最后,有人可以告诉我为什么

    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 不再突出显示,因为未指定组,但这是预期的。但在第二种情况下,即使未指定组,也会突出显示,这是意料之外的,因此感觉就像关键字一样根本不匹配。最简单的测试用例很容易证明:

    1. 突出显示作品:

      @type
    2. 突出显示不起作用:

      syntax match Test '@type'
      
      highlight default link Test Keyword
      
    3. 更新


      按照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没有突出显示?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你已经非常接近了。您对cfg_DocTag_typecfg_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插件时,语法脚本开发更容易。