我用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
。
我错过了什么?我该如何调试此问题?
答案 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
中,看看是否能解决问题。