Подтвердить что ты не робот

Выделение синтаксиса 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) это также не работает в текстовых файлах.

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

4b9b3361

Ответ 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