vimrc - vim python syntax
Problemas para usar syn-include y syn-region de Vim para incrustar resaltado de sintaxis (2)
Después de estudiar más el manual y mucho más de prueba y error, finalmente he respondido a mi propia pregunta (un logro embarazoso y sublime al mismo tiempo), que ahora guardo aquí para la posteridad.
Básicamente, creo que el problema es que el resaltado python no pythonCode
efecto porque la región pythonCode
estaba en sí misma en una región o grupo resaltado definido por tex.vim
, por lo que no era de nivel superior. La solución es include
también (en lugar de solo runtime
) tex.vim
, dándole un nombre como @TeX
, y luego agregar @TeX
containedin=@TeX
a la definición de mi región 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 si todos los unlet b:current_syntax
son estrictamente necesarios. También le di a los delimitadores de la región python un grupo de coincidencias (Snip) para que se puedan resaltar ellos mismos (con el color SpecialComment
), en lugar de SpecialComment
simplemente, que aparentemente es lo que sucede de manera predeterminada, ya que ya no se los considera parte del TeX .
Ahora es una cosa trivial agregar más regiones destacadas para diferentes idiomas (p. Ej., /begin{Scode}.../end{Scode}
), lo cual es genial si está /begin{Scode}.../end{Scode}
en la programación alfabetizada, la motivación original para mi pregunta.
Editar: aquí hay una captura de pantalla que muestra cómo funciona con Python y el código R integrado en un documento TeX:
Estoy intentando que Vim sintaxis 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 en Python, o evita que entren en vigencia, y estoy atascado tratando de descubrir 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 de nivel superior general, haciendo que rtex.vim
vea así:
runtime! syntax/tex.vim
Si ahora abro un archivo .Rtex
, el archivo completo se resalta como TeX, incluido cualquier texto dentro de /begin{python}.../end{python}
, como se esperaba.
Cuarto paso: siga las instrucciones en Vim''s :help syn-include
para incluir el resaltado python y aplicarlo 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 obligar al archivo de sintaxis python.vim
a ejecutarse aunque ya exista una sintaxis (TeX) existente.
Problema: si ahora abro un archivo .Rtex
, el archivo completo aún se resalta solo como TeX. La región /begin{python}.../end{python}
parece no tener ningún 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 desee, pero por supuesto no se resalta TeX en el resto del documento. Por lo tanto, concluyo que el resaltado TeX es de alguna manera responsable de evitar que las regiones de python entren en vigencia.
¿Puede un Maestro de Vim ofrecerme alguna sugerencia? Actualmente estoy perplejo. He examinado varias páginas y preguntas de stackoverflow que parecen relevantes, pero ninguna de ellas hasta ahora ha llevado a una solución:
No sé si me sirve, 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 su caso?