Navegar entre etiquetas de código en Emacs

A veces me enseñan bonitos programas de edición de texto (Atom, Sublime, ) haciendo bonitas cosas, pero por el momento nadie me va a convencer de abandonar el insuperable Emacs ;).

Pero sí es verdad que suelen ser cosas muy útiles, como saltar a la definición de una función o clase, directamente desde el fichero donde la estés utilizando. Era algo también a lo que estaba muy acostumbrado de mis tiempos con Eclipse.

A mi me gusta investigar como lo podría hacer con Emacs y usando herramientas estándar GNU a ser posible. Y cuando empiezas a tirar un poco del hilo, resulta que Emacs lo tenía previsto todo ¡nunca lo dudé!

GNU Global ([1]) es un sistema de etiquetado de código fuente que soporta un buen montón de lenguajes. La versión que empaqueta Debian es muy antigua, por tanto vamos a proceder a compilar e instalar la última versión.

wget http://tamacom.com/global/global-6.5.7.tar.gz
tar xf global-6.5.7.tar.gz
cd global-6.5.7
./configure --disable-gtagscscope
make
sudo make install

La interfaz en Emacs para hacer uso de GNU Global es el paquete ggtags [2]. Instalaremos este paquete de la manera habitual:

M-x package-install [RET] ggtags

En emacs por defecto no existen el concepto de proyecto como un conjunto de ficheros relacionados entre sí. Pero desde el momento en que ejecutamos el analizador de código que busca las etiquetas ya tenemos un proyecto. Iremos al directorio raíz de cualquier proyecto. En este caso trabajo con Laravel, así que voy a la raíz y ejecuto:

gtags

Si todo va bien, habrá creado tres archivos: GPATH, GRTAGS y GTAGS. Estos serán la base que utilizará ggtags para buscar las definiciones de los símbolos que conforman nuestro código (funciones, clases, interfaces, traits, etc.). Otra de las ventajas es que esos archivos se pueden usar desde otro editor, como Vim. Hemos separado la tarea de generar las tablas de símbolos de la tarea de usar esas tablas para navegar entre los ficheros de un proyecto, ese es el espíritu Unix.

Volvemos a emacs y activamos el modo ggtags:

M-x ggtags-mode

En este momento si nos colocamos sobre un símbolo (por ejemplo sobre una función) veremos que se destaca (si estamos en el modo X de emacs, no en el terminal). Estando sobre el símbolo, haremos uso de la combinación:

M-.

Y emacs nos abrirá el fichero donde se define la función, en la línea adecuada. Hay muchas más opciones para este modo, que podremos curiosear haciendo uso del nuevo menú Ggtags que habrá aparecido en el menú de emacs. Este suele ser el más común (saltar a la definición) y conviene aprenderse el atajo.

Cuando cambie el código y se vayan añadiendo y/o quitando funciones, clases y demás artefactos, hay que actualizar las tablas. Esto se puede hacer más rápido -siempre que hayas ejecutado gtags al menos una vez- con:

global -u

¡Que no te convenzan para cambiar a un editorcillo! ¡Emacs puede con todo!

Referencias:

  1. GNU Global Página principal
  2. Ggtags Proyecto en Github

Responder

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *