2011-03-03 66 views
11

我试图让Vim在语法高亮与扩展.Rtex通过以下方式结尾的任何文件:麻烦SYN-包括且同区域嵌入语法高亮

  • 所有顶级文本高亮作为TeX的
  • 例外:封闭在\begin{python}...\end{python}任何文本被高亮像Python

我能够独立实现所有这些标准,但无法同时实现。我认为TeX突出显示覆盖了我的Python突出显示的区域,或者阻止它们生效,并且我试图弄清楚如何实现。

第一步:编辑.vimrc给文件扩展名为.Rtex文件类型rtex

au BufRead *.Rtex setf rtex 

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

第三步:能通用顶级的TeX高亮显示,通过使rtex.vim这个样子的:

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}" [email protected] 

unlet! b:current_syntax命令是为了迫使python.vim语法文件来执行,即使现有的语法(特)已经被激活。

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

实验:如果我删除或注释掉runtime!命令,我 GET蟒蛇高亮,在\begin{python}...\end{python}区域内,正如所期望的,但当然没的TeX的文档的其余部分突出。因此,我得出结论说,TeX突出显示对防止蟒蛇地区发挥作用负有某种责任。

Vim的Master可以给我提供什么建议吗?我目前很难过。我已经看了几页,似乎有关问题的计算器,但他们都没有到目前为止导致了一个解决方案:

回答

14

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

基本上,我认为这个问题是因为pythonCode区域本身是包含在由tex.vim限定的区域或高亮组的Python高亮不会生效,所以还不是顶级。解决方案也是include(而不仅仅是runtimetex.vim,给它一个名称,如@TeX,然后将[email protected]添加到我的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}" [email protected] [email protected] 

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

+0

这是否导致LaTex编译时错误,因为'\ begin {Python}'是未知的? – puk 2012-02-02 21:04:54

+1

不要注意定义'python'环境的'\ usepackage {python}'。 – 2012-02-04 02:22:06

+0

如果我想使用基于'\ begin {Puk'sSuperAmazingLanguage}'的语法怎么办? = P – puk 2012-02-04 16:11:08

0

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

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

将改编版本在你的情况下工作吗?

+0

对,所以,让这两个文件类型的文件,导致双方荧光笔到处申请 - 只有部分解决方案,因为我只想在特定区域内突出显示python。不过,我不知道你可以使用这样的管道(而不是'set filetype = tex.rnoweb'),所以谢谢! – 2011-03-03 15:14:15

+0

这个管道与使用点符号如'setfiletype = js.php'有什么不同? – puk 2012-02-05 18:28:54