domingo, mayo 17, 2015

vim: Modificando el comportamiento del resaltado de sintaxis

Utilizo vim como programa editor para programar, normalmente usando los lenguajes Python y C. En C, suelo usar librerías como las glib y me interesa que las constantes, tipos y funciones también puedan controlarse desde el resaltado de sintaxis.

El resaltado de sintaxis en C está implementada en el fichero $VIMRUNTIME/syntax/c.vim. En el mismo se definen las instrucciones necesarias para que funcione el resalado de sintaxis editando código fuente en C. El problema que me planteaba es ver, si fuera posible, modificar el comportamiento de dicho plugin, pero sin necesidad de editar el fichero original. Concretamente, me interesaba añadir los tipos de datos que usa glib (gdouble, gchar, guchar, ...), algunas de sus constantes (TRUE, FALSE) o bien de los tipos de datos de otras librerías.

Durante el proceso de inicialización, vim busca diversos archivos con órdenes, para cargarlos y ejecutar las instrucciones que hay en los mismos. En el caso de Unix, el principal archivo de configuración es $HOME/.vimrc. Posteriormente cargará los plugins donde el sistema los tenga almacenados.Lo interesante, y es lo que se va a aprovechar para añadir nuestras modificaciones al comportamiento de c.vim , es que después de cargar los plugins, vim buscará en $HOME/.vim/after/ por ficheros de scripts para ejecutar órdenes. Cuando se activa el resaltado de sintaxis en un buffer de texto con código C se ejecuta el fichero $VIMRUNTIME/syntax/c.vim. Inmediatamente después, vim intentará ver si existe el fichero $HOME/.vim/after/syntax/c.vim o el directorio $HOME/.vim/after/syntax/c/*.vim. En el primer caso ejecutará las órdenes que existan en dicho fichero. En el segundo buscará todos los ficheros *.vim en el subdirectorio y los ejecutará. De esta manera vamos a poder modificar el comportamiento del resaltado de sintaxis y adaptarlo a nuestros gustos.

Por ejemplo, si quiero que vim utilice los mismos colores para mostrar los tipos de datos de glib gfloat, gint, guint, etc, lo que voy a hacer es crear un fichero en $HOME/.vim/after/syntax/c/glib.vim con el siguiente contenido

" GLIB types
syn keyword cType gchar guchar gint guint gboolean
syn keyword cType gsize gdouble gfloat gssize

Puede verse el resaltado de sintaxis en acción en este listado código:

 1 #include <glib.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 int main(int argc, char **argv)
 6 {
 7  gchar * text;
 8  gdouble *num;
 9  gsize size;
10 }

Como puede verse, hemos añadido a un grupo de sintaxis determinado, cType una serie de palabras que cuando el plugin c.vim analice el texto para resaltar la sintaxis, las interpretará como tipos de datos. La orden que se encarga de hacer esta modificación es syntax keyword, puede abreviarse como syn keyword, seguida del grupo que se quiere modificar y las palabras que usan para ello. Algunos grupos del plugin de C son cType - los tipos de datos - o cConstant - para las constantes -. Pueden verse todos los tipos definidos si en un fichero de código fuente en C con el resaltado de sintaxis activado, en modo comandos escribimos :syn

Referencias

No hay comentarios: