May 09 2013
cscope + xcscope en emacs
Para comenzar a usar xcscope, primero deberemos instalar cscope que es la herramienta de consola que se emplea para examinar codigo fuente. Cscope nos provee de herramientas tales como cscope-indexer que nos permitira generar tablas de simbolos de forma recursiva o no, con diferentes y multiples opciones, sobre nuestro proyecto.
# apt-get install cscope
Por supuesto podemos comenzar a usar cscope desde linea de comandos, para ver la lista completa de opciones podemos ejecutar:
$ cscope –help
Aunque estos son algunos de los argumentos mas tipicos:
-b : construye la referencia cruzada.
-R : crear la base de datos sobre un directorio de manera recursiva.
-v : modo detallado (verbose)
Xcscope es una feature para emacs que genera tablas de indices para ficheros fuente C y C++. Tambien es un programa cliente que conoce como generar dichas tablas para poder conocer donde se encuentra definido cierto simbolo, donde esta referenciado, etc.
Para usar xcscope realizaremos lo siguiente. Primero debemos bajar xcscope: Lo podeis descargar aqui. Y meter dicho fichero por ejemplo en ~/.emacs.d/xcscope.el
Despues de ello tan solo debemos poner lo siguiente en nuestro .emacs:
(load-file «~/.emacs.d/xcscope/xcscope.el»)
(require ‘xcscope)
Ademas de ello, podemos incluir algunos keybindings interesantes (yo lo tengo asignado en las teclas de funcion para evitar conflictos y tenerlo a mano):
(define-key global-map [(ctrl f3)] ‘cscope-set-initial-directory)
(define-key global-map [(ctrl f4)] ‘cscope-unset-initial-directory)
(define-key global-map [(ctrl f5)] ‘cscope-find-this-symbol)
(define-key global-map [(ctrl f6)] ‘cscope-find-global-definition)
(define-key global-map [(ctrl f7)] cscope-find-global-definition-no-prompting)
(define-key global-map [(ctrl f8)] ‘cscope-pop-mark)
(define-key global-map [(ctrl f9)] ‘cscope-next-symbol)
(define-key global-map [(ctrl f10)] ‘cscope-next-file)
(define-key global-map [(ctrl f11)] ‘cscope-prev-symbol)
(define-key global-map [(ctrl f12)] ‘cscope-prev-file)
(define-key global-map [(meta f9)] ‘cscope-display-buffer)
(define-key global-map [(meta f10)] ‘cscope-display-buffer-toggle)
Por supuesto existen keybidings por defecto, que pueden ser comodos para ciertos usuarios, el prefijo que se emplea es C-c s (y se debe estar en el modo adecuado visualizando codigo fuente obviamente) son los siguientes:
C-c s s : busca un simbolo
C-c s d : busca definicion global de un simbolo
C-c s g : busca un simbolo de manera global
C-c s G : busca un simbolo de manera global sin emplear el prompt
C-c s c : busca funciones que llaman dicha funcion
C-c s C : busca funciones que son llamadas desde una funcion
C-c s t : busca una cadena de texto
C-c s e : busca un patron regxp empleando egrep
C-c s f : busca un fichero
C-c s i : busca ficheros incluyendo el fichero header
Los siguientes keybindings se emplean para moverse entre los resultados:
C-c s b : muestra el buffer *cscope* donde se muestran todos los resultados.
C-c s B : muestra automaticamente el buffer *cscope* (toggle).
C-c s n : siguiente simbolo
C-c s N : siguiente fichero
C-c s p : simbolo anterior
C-c s P : fichero anterior
C-c s u : hace pop de la marca actual, es decir sale a un nivel superior de codigo a nivel de llamadas.
Los siguientes keybindings hacen referencia a settear y unsettear la variable ‘cscope-initial-directory’, (localizacion donde se busca la base de datos para cscope):
C-c s a : hace set del directorio inicial
C-c s A : hace unset del directorio inicial
Los siguientes keybindings hacen referencia al mantenimiento de la base de datos de cscope:
C-c s L : crea la lista de fichero del indice
C-c s I : crea la lista y el indice
C-c s E : edita la lista de ficheros del indice
C-c s W : muestra donde (where) se encuentra el directorio para cscope
C-c s S : muestra donde (show) se encuentra el buffer del directorio cscope.
C-c s T : localiza este (tell) directorio del buffer de cscope
C-c s D : Hace dired the directorio del buffer de cscope
Una vez hecho esto, debemos generar la base de datos, para ello debemos cercionarnos que cscope-indexer esta en nuestro PATH, y que ademas tiene permisos de ejecucion. Notese la diferencia entre cscope y cscope-indexer, uno se emplea de manera interactiva (cscope) para consola y sin mediacion de ningun editor o entorno de por medio, mientras que el otro se emplea para generar simplemente los indices para luego utilizarlos donde sea (cscope-indexer).
Ahora podemos ejecutar cscope-indexer en nuestro directorio del proyecto:
$ cd dir_del_proyecto
$ cscope-indexer -r -v
Ahora ya tan solo nos queda comenzar a usar xcscope con los keybindings e indicarle donde se encuentra nuestro directorio inicial con la tabla de simbolos. Veamos un ejemplo de como queda el asunto:
Lo tipico es moverse en una parte de codigo, ponerse encima de la funcion llamada deseada, pulsar Ctrl+F5, moverse por ese codigo, volver a pulsar Ctrl+F5 en la funcion deseada, volver a ver el listado, movernos hasta la deseada mediante Ctrl+F9 y asi sucesivamente tantos niveles como deseemos, si queremos volver atras a nivel de stack, iriamos pulsando Ctrl+F8.