无法使用Vim的syn-include和syn-region来嵌入语法高亮显示

Max*_*y-B 12 python vim latex syntax-highlighting tex

我试图让Vim语法高亮显示任何以扩展名结尾的文件,.Rtex方法如下:

  • 所有顶级文本都突出显示为TeX
  • 例外:所包含的任何文本\begin{python}...\end{python}都突出显示为Python

我能够单独实现这些标准中的每一个,但无法同时实现这两个标准.我认为以某种方式TeX突出显示覆盖了我突出显示的Python区域,或者阻止它们生效,我不知道如何弄清楚.

第一步:编辑.vimrc以提供扩展名为.Rtexfiletype的文件rtex:

  au BufRead *.Rtex setf rtex
Run Code Online (Sandbox Code Playgroud)

第二步:创造~/.vim/syntax/rtex.vim.这个文件的内容将决定如何突出显示.Rtex文件.

第三步:通过如下所示启用一般的顶级TeX突出显示rtex.vim:

runtime! syntax/tex.vim
Run Code Online (Sandbox Code Playgroud)

如果我现在打开一个.Rtex文件,整个文件将突出显示为TeX,包括其中的任何文本\begin{python}...\end{python},如预期的那样.

第四步:按照Vim中的说明:help syn-include包含python高亮显示,并将其应用于由\begin{python}和分隔的所有区域\end{python}.我的rtex.vim文件现在看起来像这样:

runtime! syntax/tex.vim
unlet! b:current_syntax
syntax include @Python syntax/python.vim
syntax region pythonCode start="\\begin{python}" end="\\end{python}" contains=@Python
Run Code Online (Sandbox Code Playgroud)

unlet! b:current_syntax命令旨在强制python.vim执行语法文件,即使现有语法(TeX)已经处于活动状态.

问题:如果我现在打开一个.Rtex文件,整个文件仍然只作为TeX突出显示.该\begin{python}...\end{python}地区似乎没有任何影响.

实验:如果我删除或注释掉的runtime!命令,我得到的Python高亮的范围内\begin{python}...\end{python}的区域,正是因为需要,但当然没的TeX的文档的其余部分突出.因此,我得出结论,TeX突出显示在某种程度上负责防止python区域生效.

Vim大师可以给我任何建议吗?我目前难倒.我已经查看了几个看似相关的页面和stackoverflow问题,但到目前为止还没有一个问题导致了解决方案:

Max*_*y-B 16

经过对手册的更多研究,以及更多的试验和错误,我终于回答了我自己的问题(一个同时令人尴尬和崇高的成就),我现在保留给后人.

基本上,我认为问题是python突出显示不会生效,因为该pythonCode区域本身包含在由其定义的区域或突出显示组中tex.vim,因此它不是顶级的.解决方案也是include(而不仅仅是runtime)tex.vim给它一个名字@TeX,然后添加containedin=@TeX到我的python区域定义.所以syntax/rtex.vim现在看起来像这样:

let b:current_syntax = ''
unlet b:current_syntax
runtime! syntax/tex.vim

let b:current_syntax = ''
unlet b:current_syntax
syntax include @TeX syntax/tex.vim

let b:current_syntax = ''
unlet b:current_syntax
syntax include @Python syntax/python.vim
syntax region pythonCode matchgroup=Snip start="\\begin{python}" end="\\end{python}" containedin=@TeX contains=@Python

hi link Snip SpecialComment
let b:current_syntax = 'rtex'
Run Code Online (Sandbox Code Playgroud)

这有效!我不确定所有这些unlet b:current_syntax命令是否都是必需的.我还给了python区域分隔符一个matchgroup(Snip),这样它们就可以自己突出显示(用SpecialComment颜色),而不是简单地留下,这显然是默认情况下发生的事情,因为它们不再被认为是TeX的一部分.

现在为不同语言添加更多高亮区域是一件微不足道的事情(例如\begin{Scode}...\end{Scode}),如果你正在进行文化编程,这是很好的 - 这是我的问题的原始动机.

编辑:这是一个截图,显示它如何与嵌入在TeX文档中的Python和R代码一起使用: 屏幕截图:嵌入在TeX中的Python和R.