我试图让Vim以下列方式突出显示任何以扩展名.Rtex
结尾的文件:
\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问题,但到目前为止还没有一个问题能够找到解决方案:
答案 0 :(得分:14)
经过对手册的更多研究,以及更多的试验和错误,我终于回答了我自己的问题(一个同时令人尴尬和崇高的成就),我现在保留给后人。
基本上,我认为问题是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'
这有效!我不确定是否所有这些unlet b:current_syntax
命令都是必需的。我还给了python区域分隔符一个匹配组(Snip
),以便它们可以自己突出显示(使用SpecialComment
颜色),而不是简单地留下,这显然是默认情况下发生的事情,因为它们不再被视为TeX的一部分。
现在为不同语言添加更多高亮区域(例如\begin{Scode}...\end{Scode}
)是一件微不足道的事情,如果你正在进行文化编程,那就太棒了 - 这是我问题的最初动机。
编辑:这是一个截图,显示它如何与嵌入在TeX文档中的Python和R代码一起使用:
答案 1 :(得分:0)
我不知道它是否有帮助,但我使用的tex和rnoweb功能的Rnw文件使用的hack如下:
au BufEnter *.Rnw set filetype=tex | set filetype=rnoweb
适用的版本会适用于您的情况吗?