17 de Mayo, 2005

vim y ctags: navegando por el código

En los próximos días tendré que comenzar un proyecto en C algo más complejo de lo que vengo haciendo últimamente, al menos en número de módulos. Aunque he probado algún que otro IDE (Integrated Development Environment), me siento más cómodo con vi (o vim si está disponible) para programar en C.

Gestionar varios ficheros a la vez es sencillo. Podemos editar más ficheros con :ed nombre_fichero, para ir saltando de uno a otro con :bu nombre_fichero. También podemos partir la pantalla en vertical/horizontal las veces que queramos (:split y :vsplit). Pero eso no es suficiente cuando manejamos varios módulos.

Sería interesante poder navegar por el código, usando el editor para saltar automáticamente desde donde se llama a una función a su implementación. Esto es posible gracias a ctags(1).

Se trata de un programa que es capaz de analizar la sintáxis de diferentes lenguajes para crear un fichero llamado tags, que es lo que va a permitir que saltemos de un sitio a otro, incluso sin importar que el destino del salto sea otro fichero.

Suele estar instalado por defecto en cualquier sistema tipo UNIX, y sino seguro que nuestro proveedor ha empaquetado una de las implementaciones existentes.

En blackshell (OpenBSD) se incluye una versión de BSD, en homeworld (mi estación de trabajo, con Ubuntu - Warty pasada a Hoary) viene la versión de GNU Tools, y he visto que en otras instalaciones se incluye exuberant ctags. Las diferencias van desde el número de lenguajes soportados hasta opciones oscuras que requieren una profunda lectura del manual. Para un uso normal con C, cualquiera nos vale :).

Tendremos que ejecutar ctags sobre los fuentes cada vez que añadamos una función o movamos implementaciones de funciones de un fichero a otro. Ejecutamos indicando dónde están los fuentes y sus cabeceras:

$ ctags *.c *.h

Nos avisará de cualquier problema que encuentre (como funciones con nombre duplicado en diferentes módulos). Podemos echarle un vistazo al fichero generado, aunque no es necesario (solo por curiosidad).

Voy a hacer los ejemplos con DD2 (que tengo algo olvidado, por cierto).

Ahora podemos empezar a navegar por el código. Solo hay que conocer un par de comandos y tener en cuenta que los tags se gestionan con una pila.

Por ejemplo, queremos empezar a editar una función concreta:

$ vi -t engine_obj

Eso nos abrirá, en este caso, el fichero engine.c en la línea 245, justo al comienzo de la implementación de la función engine_obj.

Si nos desplazamos a la línea 326 y nos situamos en la primera letra de engine_add_vefx y pulsamos CTRL + ] (en X11 hará falta pulsar también ALT GR), saltaremos a la línea 488, al comienzo de la implementación de esa función.

Si ahora miramos la pila de tags:

:tags
  # A «tag»       DESDE la línea   en el fichero/texto
  1  1 engine_obj          1  /*
  2  1 engine_add_vefx   326  engine_add_vefx(VFX_SHUP,ot->x,ot->y);
>

Lo que nos indíca los saltos que hemos hecho en la forma: marca (tag), origen del salto y el fichero o texto desde el que hemos saltado (con el > indicando la cima de la pila). Si queremos volver atrás en la pila, es decir, retroceder en un salto, emplearemos CTRL + t. En este caso nos llevará de vuelta a la línea 326.

También podemos ir a un tag concreto desde el editor con :tag nombre_marca (vim nos va mostrando nombres si pulsamos el tabulador en este punto).

Y con esto quedaría descrito el uso más básico y funcional de los tags. Hay muchas más cosas, pero para eso ya está la documentación de vim. Solo hay que recordar regenerar el fichero tags cuando sea necesario y llevar cuidado de grabar los cambios en el fuente antes de realizar un salto, no sea que los perdamos en nuestro viaje por el código ;).

Anotación por Juan J. Martínez, clasificada en: programing.

Hay 2 comentarios

Gravatar

Personalmente el vim lo uso para editar cuatro cosas y punto. Jamás se me ocurriría desarrollar un proyecto con vim o cualquier editor del estilo; sobre todo si ese proyecto conlleva muchos módulos fuente o ficheros de distinto tipo.
Existen buenos IDEs que facilitan la tarea y aumetan la productividad, como KDevelop o incluso anjuta.
En linux (uso Slackware) he usado KDevelop, y aunque aún le queda mucho para alcanzar el nivel de IDEs como Visual Studio (sin duda, el mejor IDE que existe), no está nada mal (desde luego mejor que vim, lo es xD) Emacs puede valer, aunque ya como última medida.
Otra opción posible es el eclipse + CDT, aunque la pega está en que eclipse chupa recursos a mansalva .
De todas formas tengo compañeros de trabajo que son máquinas manejando el vim, pero vamos, opino que es complicarse la vida. Además, es que trabajar con vim ocho (o más) horas diarias... es deprimente leñe xD.

por aleamb, en 2005-05-17 19:43:03

Gravatar

Y qué quieres que te diga... acabo usando el editor solamente, con lo que me parece una chorrada desperdiciar tantos recursos. ¿Tú que buscas en un IDE?

Si te refieres a diseñadores de GUI, no hablamos de lo mismo. Para eso está Qt Designer o Glade. Yo hablo de un editor para editar código, y no veo porqué VS es tan brillante (tuve que usar el 6.0 hace un tiempo para programar algo con MFC cuando estaba en la empresa, es mi única experiencia con él).

El tema de la productividad es curioso. ¿Tú eres más productivo con un IDE? Yo no. Así que es algo relativo, ¿eres más productivo que yo? Contestes lo que contestes, ¿eso hace mejor al editor/IDE que use cada uno o hablamos del programador? ;)

En cualquier caso hablo de una función que me parece interesante, no invito a nadie a usar vi (ni mucho menos).

por Juanjo, en 2005-05-17 21:40:53

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.