Problemas al usar syn-include y syn-region de Vim para integrar el resaltado de syntax

Estoy tratando de hacer que Vim syntax resalte cualquier archivo que termine con la extensión .Rtex de la siguiente manera:

  • Todo el texto de nivel superior se resalta como TeX
  • Excepción: cualquier texto incluido en \begin{python}...\end{python} se resalta como Python

Puedo lograr cada uno de estos criterios individualmente, pero no puedo lograr ambos simultáneamente. Creo que de alguna manera el resaltado TeX anula mis regiones resaltadas con Python, o impide que tengan efecto, y estoy atascado tratando de averiguar cómo.

Primer paso: edite .vimrc para dar a los archivos con extensión .Rtex el tipo de archivo rtex :

  au BufRead *.Rtex setf rtex 

Segundo paso: crear ~/.vim/syntax/rtex.vim . Es el contenido de este archivo el que determinará cómo resaltar los archivos .Rtex .

Tercer paso: habilite el resaltado TeX general de nivel superior, haciendo que rtex.vim vea así:

 runtime! syntax/tex.vim 

Si ahora abro un archivo .Rtex , todo el archivo se resalta como TeX, incluido cualquier texto dentro de \begin{python}...\end{python} , como se esperaba.

Cuarto paso: siga las instrucciones de Vim :help syn-include para incluir el resaltado de python y aplíquelo a todas las regiones delimitadas por \begin{python} y \end{python} . Mi archivo rtex.vim ahora se ve así:

 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 

¡El unlet! b:current_syntax unlet! b:current_syntax comando unlet! b:current_syntax está destinado a forzar el archivo de syntax python.vim para que se ejecute a pesar de que una syntax existente (TeX) ya está activa.

Problema: si ahora abro un archivo .Rtex , el archivo completo sigue resaltado solo como TeX. La región \begin{python}...\end{python} parece no tener efecto.

Experimento: Si elimino o comento el runtime! comando, obtengo el resaltado de Python, dentro de las regiones \begin{python}...\end{python} , exactamente como se desea, pero por supuesto no hay resaltado TeX en el rest del documento. Por lo tanto, concluyo que el resaltado TeX es de alguna manera responsable de evitar que las regiones python surtan efecto.

¿Puede un maestro de Vim ofrecerme alguna sugerencia? Actualmente estoy perplejo. He mirado varias páginas y preguntas de stackoverflow que parecen relevantes, pero ninguna de ellas ha conducido hasta ahora a una solución:

  • http://vim.wikia.com/wiki/Different_syntax_highlighting_within_regions_of_a_file
  • Sintaxis incrustada resaltada en Vim
  • Resaltado de syntax VIM de html nested en yaml

Después de un estudio más del manual, y mucho más ensayo y error, finalmente he respondido mi propia pregunta (un logro simultáneamente embarazoso y sublime), que ahora conservo aquí para la posteridad.

Básicamente, creo que el problema es que el resaltado de Python no tendría efecto porque la región pythonCode estaba contenida en una región o grupo de resaltado definido por tex.vim , por lo que no era de nivel superior. La solución es también include (en lugar de solo runtime ) tex.vim , dándole un nombre como @TeX , y luego agregar containedin=@TeX a mi definición de región de python. Entonces la syntax/rtex.vim ahora se ve así:

 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' 

¡Y esto funciona! No estoy seguro de que todos esos unlet b:current_syntax sean estrictamente necesarios. También le di a los delimitadores de la región python un matchgroup (Snip) para que se puedan resaltar ellos mismos (con el color del SpecialComment ), en lugar de SpecialComment sin formato, lo que aparentemente es lo que sucede por defecto, ya que ya no se consideran parte del TeX .

Ahora es una cosa trivial agregar más regiones destacadas para diferentes idiomas (por ejemplo, \begin{Scode}...\end{Scode} ), lo cual es genial si te \begin{Scode}...\end{Scode} en la progtwigción literaria, la motivación original para mi pregunta.

Edición: aquí hay una captura de pantalla que muestra cómo funciona con Python y el código R incrustado en un documento TeX: Captura de pantalla: Python y R incrustados en TeX.

No sé si ayuda, pero un truco que uso con mis archivos Rnw que usan las funciones tex y rnoweb es el siguiente:

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

¿Funcionaría una versión adaptada en tu caso?