Вот что я получил до сих пор:
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
Есть 2 проблемы с этим:
- Теперь
@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
уже не подсвечивается так как группа не указана, а это ожидаемо. Но во втором случае оно подсвечивается, хотя группа не указана, что неожиданно, поэтому создается впечатление, что как ключевое слово оно вообще не подходит. И это легко доказать с помощью простейшего теста:
Подсветка работ:
syntax match Test '@type' highlight default link Test Keyword
Выделение не работает:
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
ничего не меняет, то есть эффект наследования остается неизменным. Но почему cfg_DocField_type
не выделено? Есть идеи?
vimrc
? - person EverythingRightPlace   schedule 26.10.2013cpp
, тогда вы поместите свой собственныйcpp.vim
в.vim/after/syntax
. Если вы пишете что-то новое с нуля или хотите полностью переопределить стандартное, поставляемое с Vim, скажем,cpp
, тогда вам нужно поставить.vim/syntax
. - person Alexander Shukaev   schedule 26.10.2013