混合两个语法高亮脚本

时间:2013-04-24 20:49:30

标签: vim

我用Jekyll写博客文章,为此我最终在同一个文件中使用了三种不同的语言:YAML在开始时用于发布元数据,Markdown在正文中,C ++在代码片段中。

我尝试设置一个脚本,这样我就可以让vim为我正确地突出显示所有这三个脚本,并在语法/ jekyll.vim中得到类似的结果:

" Build upon Markdown syntax
runtime! syntax/markdown.vim

" pretend there's no syntax loaded
unlet b:current_syntax
" Bring in YAML syntax for front matter
syntax include @Yaml syntax/yaml.vim
syntax region yamlFrontmatter start=/\%^---$/ end=/^---$/ keepend contains=@Yaml

" pretend there's no syntax loaded
unlet b:current_syntax
" Bring in C++11 syntax for code snippets
syntax include @Cpp syntax/cpp.vim
syntax region cppCodeSnippet matchgroup=Comment start=/^{% highlight cpp %}$/ end=/^{% endhighlight %}$/ keepend contains=@Cpp

let b:current_syntax='jekyll'

我还设置了一个文件检测脚本,将ft设置为此语法。

几乎有效。当我打开一个被检测为这种类型的文件时,我得到的所有内容都是正确的之外的C ++高亮显示。但是,如果我之后键入:syn on,一切正常。我可以删除缓冲区并再次打开文件,所有亮点都可以。如果我关闭vim并再次启动它,我需要再次运行:syn on

我错过了什么?我该如何调试此问题?

1 个答案:

答案 0 :(得分:3)

快速修复:syntax on追加到.vimrc的最后一行,这与在实时会话中设置:syn on相同。

不那么快:

您可能已在$VIMRUNTIME中的默认语法文件旁边安装了自定义'jekyll'语法。

根据Vim wiki section on custom syntax,最好将所有个人自定义设置在~/.vim之内。例如,将jekyll.vim语法放在~/.vim/syntax/中。

  

不要使用包含随Vim一起分发的文件的目录,因为在升级过程中会覆盖该文件(特别是不要使用$ VIMRUNTIME目录)。

Vim syntax docs中: :syntax enable运行':source $ VIMRUNTIME / syntax / DEFAULT_SYNTAX.vim'。
:syn on(或:syntax on)将“使用默认值覆盖您的设置”。

因此,如果设置:syntax on使您的自定义语法有效,则必须将其包含在默认语法集中。

尝试将所有自定义内容保留在~/.vim中,看看是否能解决问题。