我试图让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 highlighting,并将其应用于由\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区域生效。维姆大师能给我提些建议吗?我现在被难住了。我看了几页和StackOverflow问题,这些问题似乎很相关,但到目前为止还没有一个解决方案:
http://vim.wikia.com/wiki/Different_syntax_highlighting_within_regions_of_a_file
Embedded syntax highligting in Vim
VIM syntax highlighting of html nested in yaml
最佳答案
经过对手册的进一步研究,以及更多的尝试和错误,我终于回答了我自己的问题(同时也是一个令人尴尬和崇高的成就),现在我把它保存在这里留给子孙后代。
基本上,我认为问题在于python高亮显示不会生效,因为pythonCode
区域本身包含在由tex.vim
定义的区域或高亮组中,所以它不是顶级的。解决方案是也给它取一个类似于include
的名称,然后将runtime
添加到我的python区域定义中。所以现在看起来像这样:
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'
这是可行的!我不确定是否所有这些
tex.vim
命令都是严格必要的。我还给python区域分隔符一个matchgroup(@TeX
),这样它们就可以自己突出显示(使用containedin=@TeX
颜色),而不是只留下普通的,这显然是默认情况下发生的,因为它们不再被视为tex的一部分。现在,为不同的语言(例如,
syntax/rtex.vim
)添加更多的突出显示区域是一件微不足道的事情,如果你正在学习识字编程——这是我提出问题的最初动机——那就太好了。编辑:下面是一个屏幕截图,显示它如何处理嵌入在Tex文档中的python和r代码:
关于python - 无法使用Vim的syn-include和syn-region来嵌入语法高亮显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5176972/