Существует относительно простой способ иметь разные регионы в вашем коде, которые используют разные файлы синтаксиса, используя команду «синтаксис включения» и команду «область синтаксиса» для определения каждой области. Ниже приведен некоторый код, который я должен синтаксически выделить в разных документах 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'
Я не уверен в том, как получить разные авто-отступы в регионах, это вопрос, который я собирался рассмотреть сам. Я думаю, что одним из решений было бы объединить все файлы отступов языков в один и иметь структуру if, которая обрабатывает в соответствии с тем, в каком регионе он находится. Возможно, есть более простой способ, чем этот.