Выделение синтаксиса 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) это также не работает в текстовых файлах.
Буду благодарен за ваши мысли или предложения, и благодарю вас за чтение.
Ответы
Ответ 1
ознакомьтесь с моим родственным вопросом: Неисправность использования syn-include и син-региона 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}}}' [email protected] [email protected]
hi link Snip SpecialComment
let b:current_syntax = 'yaml.html'
Блок с командой runtime!
может оказаться ненужным, если ваш YaML уже выделен.
Ответ 2
Вы можете попробовать добавить следующее в свой .vimrc
:
autocmd BufRead,BufNewFile *.yaml setfiletype html.yaml
Файл yaml будет считаться как типом yaml
, так и html
, и должна применяться как синтаксическая цветовая схема, но я действительно не знаю, как разрешаются конфликты между двумя схемами...
Ответ 3
Похоже, вы хотите переместить начальный шаблон в начало следующей строки:
template : |+
#{{{html
<div>Hello, world</div>
#html}}}
Подробнее:
Я нахожусь на WinXP, но я видел почти такое же поведение, которое вы описали.
Когда в файле с ytyl типа filetype после вызова TextEnableCodeSnip
я не видел изменения, пока не переместил начальный шаблон вниз в начало следующей строки. Я был способен видеть, что подсветка синтаксиса работает в файле без файлового типа, хотя это все равно шанс, что это не сработает для вас.
Ответ 4
Я использовал решение Maxy-B. Мой код, в частности, немного отличается, поэтому я решил опубликовать его для потомков:
~/.vim/после/синтаксис/yaml.vim
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
\ [email protected]
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
\ [email protected]
Это выделяет узлы 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