嵌入在yaml中的html的VIM语法高亮显示

时间:2011-01-28 15:03:51

标签: syntax-highlighting vim vim-syntax-highlighting

给定yaml文件包含html,如下所示:

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

Vim(版本7.3.087)是否可以使用html语法高亮突出显示html部分?

我找到了帖子Different syntax highlighting within regions of a file,它似乎与我正在寻找的概念完全一致,但是我无法按照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 个答案:

答案 0 :(得分:12)

查看我的相关问题:Trouble using Vim's syn-include and syn-region to embed syntax highlighting。在那里,我试图在TeX中嵌入Python,但我认为该解决方案也适用于您的情况。

我想你想做这样的事情:

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'

如果您的YaML已经突出显示,则可能不需要使用runtime!命令的块。

答案 1 :(得分:1)

您可以尝试在.vimrc中添加以下内容:

autocmd BufRead,BufNewFile *.yaml setfiletype html.yaml

yaml文件将被视为类型yamlhtml,并且应该应用两种语法颜色方案,但我真的不知道如何处理这两种方案之间的冲突。 ..

答案 2 :(得分:1)

看起来您想将开始模式移动到下一行的开头:

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

更多详情:

我在使用WinXP,但我看到几乎与您描述的行为相同。

在文件类型为yaml的文件中,在调用TextEnableCodeSnip之后,我没有看到更改,直到我将启动模式向下移动到下一行的开头。我 能够在没有文件类型的文件中看到突出显示工作的语法,所以这仍然不适合你。

答案 3 :(得分:0)

我使用了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
    \ 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节点htmltex。它不是很有活力,但它符合我的目的,这可以作为某人做类似事情的有用指南。它将按预期(或至少,如我所料)突出显示以下内容,例如:

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