Подсветка синтаксиса вложенных сгибов комментариев в Vim - PullRequest
3 голосов
/ 09 декабря 2011

В Vim я использую стандартные маркеры сгиба {{{, }}} с соглашением об именовании сгибов (например, {{{ collection). Некоторые именованные сгибы определяют комментарий (например, {{{ documentation), и я хотел бы, чтобы они были выделены как таковые. Все складки оканчиваются одинаковым маркером }}}.

У меня есть некоторый успех со следующим:

syn region cComment start="{{{ documentation" end="}}}"
    contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell fold

но проблема в том, что закомментированные сгибы могут также содержать общие collection сгибы, как в следующем примере:

{{{ documentation
    {{{ collection
    // some text
    }}}
    {{{ collection
    // some text
    }}}
}}}}

В этом случае комментирование прекращается при достижении первого }}}, поэтому второй collection сгиб не выделяется как комментарий.

Параметр contains не выглядит актуальным, так как это делает стандартные складки имеющими стандартную подсветку.

Мне бы хотелось, чтобы любой сгиб внутри сгиба комментариев наследовал синтаксис комментария, не затрагивая их синтаксис по умолчанию вне сгиба комментария. Возможно ли это в Vim, учитывая, что все сгибы имеют одинаковые конечные маркеры?

Ответы [ 2 ]

4 голосов
/ 13 декабря 2011
" Hi. Two syntax regions aren't enough, you have to use a third. There
" are two important things to note. First, 'matchgroup' (see :help
" :syn-matchgroup) prevents contained items from matching in the start
" and end patterns of the containing item. Second 'transparent' (see
" :help :syn-transparent) allows the inheriting of an item's containing
" syntax colouring.
"
" Save this entire text in a file and then :source it to see the effect.
"
"   blah
"   {{{ collection
"       blah
"   }}}
"   blah
"   {{{ documentation
"       {{{ collection
"           blah
"       }}}
"       blah
"       {{{ collection
"           blah
"       }}}
"   }}}
"   blah
"   {{{ collection
"       // some text
"   }}}
"   blah

syn clear

hi documentation guifg=darkcyan ctermfg=darkcyan
hi collection guifg=darkmagenta ctermfg=darkmagenta

syn region genericdoc start="{{{" end="}}}" transparent
syn region collection start="{{{ collection" end="}}}"
syn region documentation matchgroup=documentation
\ start="{{{ documentation" end="}}}" contains=genericdoc
0 голосов
/ 11 декабря 2011

Честно говоря, я не совсем уверен, что вы хотите, но, похоже, есть способ различить конец вашей «документации» и конец вашей «коллекции».Приведенный ниже код завершит область cComment, только когда три правильные скобки найдены в качестве первых символов в строке:

syn region cComment start="{{{ documentation" end="^}}}"
    contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell fold

Кроме того, опция 'fold' в вашей команде синтаксической области не применима, если выиспользуя маркеры для определения сгибов.Использование сгиба с син-регионом полезно, только если вы используете синтаксис для указания сгибов, а это не так.

...