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

时间:2011-03-03 05:21:19

标签: python vim latex syntax-highlighting tex

我试图让Vim以下列方式突出显示任何以扩展名.Rtex结尾的文件:

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

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

第一步:修改.vimrc,为文件类型.Rtex提供扩展名为rtex的文件:

  au BufRead *.Rtex setf rtex

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

第三步:通过使rtex.vim看起来像这样来启用常规顶级TeX突出显示:

runtime! syntax/tex.vim

如果我现在打开.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

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

问题:如果我现在打开.Rtex文件,整个文件仍然仅作为TeX突出显示。 \begin{python}...\end{python}区域似乎没有效果。

实验:如果我删除或注释掉runtime!命令,我执行\begin{python}...\end{python}区域内进行python突出显示期望,但当然在文档的其余部分没有TeX突出显示。因此,我得出结论,TeX突出显示在某种程度上负责阻止python区域生效。

Vim大师可以给我任何建议吗?我目前难倒。我看过几个看似相关的页面和stackoverflow问题,但到目前为止还没有一个问题能够找到解决方案:

2 个答案:

答案 0 :(得分:14)

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

基本上,我认为问题是python突出显示不会生效,因为pythonCode区域本身包含在由tex.vim定义的区域或突出显示组中,所以它不是顶级的-水平。解决方案也是include(而不仅仅是runtimetex.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'

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

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

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

答案 1 :(得分:0)

我不知道它是否有帮助,但我使用的tex和rnoweb功能的Rnw文件使用的hack如下:

 au BufEnter *.Rnw set filetype=tex | set filetype=rnoweb 

适用的版本会适用于您的情况吗?