Подсветка синтаксиса VIM html, вложенного в yaml

дали yaml файл, содержащий html, например:

template        : |+ 
    <div>Hello, world</div>

возможно ли в Vim (версия 7.3.087) выделить часть html с помощью html подсветку синтаксиса?

я нашел пост различная подсветка синтаксиса в пределах областей файла, который, кажется, имеет именно ту концепцию, которую я искал, но я не могу заставить ее работать так, как ожидалось с yaml. Я ожидал бы, что смогу сделать следующее (Как предложено в ссылка):

" .vimrc
" include the code from the above link
call TextEnableCodeSnip('html' ,'#{{{html' ,'#html}}}', 'SpecialComment')
есть yaml, например:
 template        : |+  #{{{html
    <div>Hello, world</div>
 #html}}}

к сожалению, это не работает как ожидалось, т. е. html код остается полностью выделена yaml. Я также отметил, что с моей конфигурацией (MacVim 55) это также не работает в текстовых файлах.

я был бы благодарен за ваши мысли и предложения, и спасибо за чтение.

4 ответов


проверьте мой вопрос: проблема с использованием syn-include и syn-region Vim для встраивания подсветки синтаксиса. Там я пытаюсь встроить Python в TeX, но я думаю, что решение может работать и для вашего случая.

Я думаю, что вы хотите сделать что-то вроде этого:

let b:current_syntax = ''
unlet b:current_syntax
runtime! syntax/yaml.vim

let b:current_syntax = ''
unlet b:current_syntax
syntax include @YaML syntax/yaml.vim

let b:current_syntax = ''
unlet b:current_syntax
syntax include @HTML syntax/html.vim
syntax region htmlEmbedded matchgroup=Snip start='#{{{html' end='#html}}}' containedin=@YaML contains=@HTML

hi link Snip SpecialComment
let b:current_syntax = 'yaml.html'

блок runtime! команда может быть ненужной, если ваш YaML уже выделен.


вы можете попытаться добавить следующее в свой .vimrc:

autocmd BufRead,BufNewFile *.yaml setfiletype html.yaml

файл yaml будет считаться обоими типами yaml и html и обе цветовые схемы синтаксиса должны применяться, но я действительно не знаю, как рассматриваются конфликты между двумя схемами...


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

template        : |+  
#{{{html
    <div>Hello, world</div>
#html}}}

Подробнее:

Я на WinXP, но я видел почти то же самое поведение, которое вы описали.

когда в файле с типом файла yaml, после вызова TextEnableCodeSnip Я не видел изменений, пока не переместил начальный шаблон в начало следующей строки. Я!--5-->был возможность видеть работу подсветки синтаксиса в файле однако без типа файла, так что это все еще шанс, что это не сработает для вас.


я использовал решение Maxy-B. Мой код, в частности, немного отличается, поэтому я решил опубликовать его для потомков:

~/.vim / after / синтаксис / yaml.ВИМ

let b:current_syntax = ''
unlet b:current_syntax
syntax include @HTML syntax/html.vim

syntax region htmlCode start=#^html:#hs=e+1 end=+^\w+he=s-1,me=s-1
    \ contains=@HTML

let b:current_syntax = ''
unlet b:current_syntax
syntax include @TEX syntax/tex.vim

syntax region texCode start=#^tex:#hs=e+1 end=+^\w+he=s-1,me=s-1
    \ contains=@TEX

это подчеркивает узлы YAML верхнего уровня html и tex С этими соответствующими типами кода. Это не очень динамично, но это соответствует моей цели, и это может служить полезным руководством для кого-то, кто делает что-то подобное. Он выделит следующее, как ожидалось (или, по крайней мере, как я ожидаю), для пример:

regular:  # yaml
   - yaml # yaml
html: 
    <b>hello</b> # html
tex:
    \begin{document} # tex
    \end{document} # tex
the-end: may be necessary # yaml