2011-03-03 10 views
11

que estoy tratando de conseguir Vim a la sintaxis resaltar cualquier archivo que termina con la extensión .Rtex de la siguiente manera:problemas para usar de Vim syn-inclusión y syn-región para incrustar resaltado de sintaxis

  • se destacó Todo el texto de nivel superior como TeX
  • Excepción: cualquier texto entre \begin{python}...\end{python} se destaca como Python

soy capaz de lograr cada uno de estos criterios de forma individual, pero incapaz de lograr ambas cosas 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: edición .vimrc para dar 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: permiten TeX resaltado en general de nivel superior, al hacer rtex.vim tener este aspecto:

runtime! syntax/tex.vim 

Si ahora abrir un archivo .Rtex, todo el archivo está seleccionado como TeX, incluyendo cualquier texto dentro de \begin{python}...\end{python}, como se esperaba.

Cuarto paso: siga las instrucciones de Vim de :help syn-include incluir resaltado pitón 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}" [email protected] 

El comando unlet! b:current_syntax está destinado a forzar el archivo python.vim sintaxis para ejecutar a pesar de una sintaxis existente (TEX) ya está activo.

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

Experimento: Si quito o comentario a cabo el comando runtime!, que hacen get pitón resaltado, dentro de los \begin{python}...\end{python} regiones, tal y como se desee, pero por supuesto no TeX destacando 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 Master of Vim ofrecerme alguna sugerencia? Actualmente estoy perplejo.He mirado en varias páginas y preguntas StackOverflow que parecen relevantes, pero ninguno de ellos ha llevado hasta ahora a una solución:

Respuesta

14

Después de estudiar más el manual, y mucho más de prueba y error, finalmente he respondido 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 de python no surtirá efecto porque la región pythonCode estaba en una región o grupo resaltado definido por tex.vim, por lo que no era de nivel superior. La solución también es include (en lugar de solo runtime) tex.vim, dándole un nombre como @TeX, y luego agregue [email protected] a la definición de mi región python. Entonces 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}" [email protected] [email protected] 

hi link Snip SpecialComment 
let b:current_syntax = 'rtex' 

Y esto funciona! No estoy seguro si todos esos comandos unlet b:current_syntax son estrictamente necesarios. También le di a los delimitadores de la región de Python un grupo de coincidencia (Snip) para que se puedan resaltar ellos mismos (con el color SpecialComment), en lugar de simplemente dejarlo, que aparentemente es lo que sucede de manera predeterminada, ya que ya no se consideran parte del TeX .

Ahora es una cosa trivial para agregar más regiones destacadas para diferentes idiomas (por ejemplo, \begin{Scode}...\end{Scode}), lo cual es genial si está ingresando a la programación alfabetizada: la motivación original para mi pregunta.

Editar: aquí hay una captura de pantalla que muestra cómo funciona con el código Python y R incrustado en un documento TeX: Screenshot: Python and R embedded in TeX

+0

¿Esto lleva a errores de tiempo de compilación de LaTex ya que '\ begin {Python}' es desconocido? – puk

+1

No, observe el '\ usepackage {python}' que define el entorno 'python'. –

+0

¿Qué sucede si quiero usar la sintaxis basada en '\ begin {Puk'sSuperAmazingLanguage}'? = P – puk

0

no lo hago saber si ayuda, pero un truco que uso con mis archivos Rnw que usan las características de tex y rnoweb es el siguiente:

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

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

+0

Derecho, por lo que le da el archivo de ambos tipos de archivos, haciendo que ambos marcadores para aplicar en todas partes - sólo solución parcial, ya que solo quiero resaltar python dentro de ciertas regiones. Sin embargo, no sabía que pudieras usar un tubo así (a diferencia de 'set filetype = tex.rnoweb'), ¡así que gracias! –

+0

¿difiere la tubería de usar notación de puntos como 'setfiletype = js.php'? – puk

Cuestiones relacionadas