以下是我目前的翻译:
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
我接下来想要做的是突出显示在
@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
这里有两个问题:
- 现在,
@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
不再被突出显示,因为组未指定,但这是预期的。但在第二种情况下,即使未指定组,它也会被突出显示,这是意外的,因此它似乎根本不匹配作为关键字。而且通过最简单的测试用例很容易证明:
Highlighting works:
syntax match Test '@type' highlight default link Test Keyword
Highlighting doesn't work:
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
这个东西如果能正常工作就完美了。它可以避免我们重复匹配评论,并实现自然继承。顺便提一句,省略
@
在 type
前面并不会改变任何东西,即继承效果保持不变。但为什么 cfg_DocField_type
没有被突出显示呢?有什么想法吗?
vimrc
中吗? - EverythingRightPlacecpp
,那么你需要将自己的cpp.vim
文件放到.vim/after/syntax
目录下。如果你要从头开始编写新的语法高亮文件或者完全覆盖Vim自带的标准文件,比如cpp
,那么你需要将文件放到.vim/syntax
目录下。 - Alexander Shukaev