El editor vi, aunque es complejo de aprender, es uno de los editores más potentes que hay. Una vez aprendidos sus comandos, permite realizar tareas muy complejas con la pulsación de un par de teclas.
Una posibilidad bastante desconocida del editor vi es que permite navegar por el código C. Si tenemos un tipo de código C (un enumerado, una estructura, una función,... ) que se está usando en el código que se está editando, podemos ir fácilmente al fichero que define ese tipo y que el cursor se situe exactamente en el sitio en que está definido el tipo. Vamos a ver cómo
En unix/linux tenemos el comando ctags. Este comando, pasándole varios ficheros .h y .c genera un fichero (que por defecto se llama tags) en el que pone un índice con todos los tipos definidos en el programa C, en qué fichero y en qué línea se encuentran.
Su sintaxis es más o menos esta
$ ctags -t <fichero.h> <fichero.c> ...
La opción -t hace que se pongan en el fichero índice también los typedef.
Si nuestros ficheros de código están en varios directorios, hay que poner alguna forma cómoda de buscarlos.
Supongamos, por ejemplo, que tenemos un directorio /users/chuidiang/MI_PROYECTO y que de ahi para abajo hay subdirectorios en los cuales están nuestros .h y nuestros .c. Una forma cómoda y rápida de ejecutar este comando para todos nuestros ficheros es la siguiente
$ cd /users/chuidiang/MI_PROYECTO
$ ctags -t `find . -name *.c -name *.h`
El comando find, tal cual está escrito ahi, buscará del directorio actual hacia abajo todos los ficheros .h y .c. Para que este comando se ejecute y el resultado se pase a ctags, es necesario encerrarlo entre esas comillas que aparecen. Atención al sentido de las comillas. No es lo mismo ` que ' y en el comando se usan las primeras.
El resultado de esto es un fichero tags en el que están todos los tipos de nuestro proyecto.
Todo lo que hagamos a partir de ahora con el vi, lo hacemos en el directorio en el que está el fichero tags, en nuestro ejemplo en /users/chuidiang/MI_PROYECTO.
Desde la línea de comandos de la shell, para ir directamente a donde está definido un tipo o una función, basta con poner
$ cd /users/chuidiang/MI_PROYECTO
$ vi -t MiTipo
Esto abrirá el vi en el fichero .h o .c en el que se define ese tipo. Situará el cursor justo en la definción del tipo.
Una vez abierto el fichero en el vi, si queremos ir hasta otro tipo, bastará con ejecutar el comando de vi :ta
:ta OtroTipo
Esto nos llevará a la definción del otro tipo, aunque esté en otro fichero y en otro directorio.
Supongamos que lo tenemos todo preparado (hemos ejecutado el comando ctags, estamos editando con el vi nuestro código y estamos en el directorio que contiene el ficheto tags). Queremos usar la función imprimir() que nos hicimos en otro fichero y no nos acordamos exacatmente de los parámetros que lleva. Nos podemos ir a esa función escribiendo
:ta imprimir
Una vez en la definición de la función imprimir(), con sus parámetros, y el vi en modo de comandos, la siguiente secuencia de teclas nos copia la línea con la definición de la función en un buffer.
"ayy
Ahora, con el comando
:#
volvemos al fichero que estábamos editando, justo en el sitio que lo teníamos. Con la siguiente pulsación de teclas (con el vi en modo comandos), se copia la linea de la función imprimir(), con sus parámetros, que habíamos guardado en el buffer.
"ap
Listo, ya tenemos la función imprimir() con sus parámetros escrita en el editor. Ahora sólo tenemos que modificar los parámetros para que sean los nuestros.