我正在使用jinja模板语言为网站生成html和javascript.我怎样才能让vim明白'{{'/'}}'和之间的一切'{%'/'%}'都是Jinja代码,其余的是javascript代码?有一个简单的方法吗?
通过使用"syntax include"命令和"语法区域"命令来定义每个区域,有一种相对简单的方法可以在代码中使用不同的语法文件.下面是一些代码我必须在单个文档中突出显示Perl,R和Python的不同区域.'unlet'语句是必需的,因为语法文件通常依赖于b:current_syntax在首次运行时不存在.您的情况类似,但使用您在问题中列出的分隔符为jinja和javascript区域定义"开始"和"结束".查看"syn-region"和"syn-include"的帮助以获取更多信息:
let b:current_syntax = ''
unlet b:current_syntax
syntax include @Perlcode $VIMRUNTIME\syntax\perl.vim
syntax region rgnPerl start='^src-Perl' end='^end-Perl' contains=@Perlcode
let b:current_syntax = ''
unlet b:current_syntax
syntax include @rinvim $VIMRUNTIME\syntax\r.vim
syntax region rgnR matchgroup=Snip start="^src-R" end="^end-R" keepend contains=@rinvim
let b:current_syntax = ''
unlet b:current_syntax
syntax include @python $VIMRUNTIME\syntax\python.vim
syntax region rgnPython matchgroup=Snip start="^src-Python" end="^end-Python" keepend contains=@python
let b:current_syntax='combined'
Run Code Online (Sandbox Code Playgroud)
我不确定如何在这些地区获得不同的自动缩进,这是我要调查自己的问题.我认为一种解决方案是将所有语言缩进文件合并为一个,并使用if结构根据它所处的区域进行处理.但是,可能有一种比这更简单的方法.
对于语法,我的SyntaxRange 插件使设置就像单个函数调用一样简单。
对于不同的文件类型设置(例如缩进选项),您必须安装一个:autocmd CursorMoved,CursorMovedI检查当前行属于哪个区域的工具(可能使用提示语法,例如 with synID()),然后根据结果交换选项值。
编辑:对于您的特定用例,这将是这样的:
:call SyntaxRange#Include('{{', '}}', 'jinja')
:call SyntaxRange#Include('{%', '%}', 'jinja')
Run Code Online (Sandbox Code Playgroud)
您可以将~/.vim/after/syntax/javascript.vim其自动应用到所有 JavaScript 文件。