26

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

我尝试设置一个脚本,以便我可以让 vim 为我正确突出显示所有三个,最后在 syntax/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再次运行。

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

4

1 回答 1

3

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

没那么快:

看起来您可能已经将自定义的 'jekyll' 语法与$VIMRUNTIME.

根据自定义语法的 Vim wiki 部分,最好将所有个人自定义保留在~/.vim. 例如,将您的jekyll.vim语法放在~/.vim/syntax/.

不要使用包含随 Vim 分发的文件的目录,因为它会在升级期间被覆盖(特别是不要使用 $VIMRUNTIME 目录)。

Vim 语法文档中:
:syntax enable运行 ':source $VIMRUNTIME/syntax/DEFAULT_SYNTAX.vim'。
:syn on(或者:syntax on)将“用默认值推翻您的设置”。

所以如果设置:syntax on使您的自定义语法工作,它必须包含在默认语法集中。

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

于 2013-10-09T23:00:00.120 回答