{"id":472,"date":"2013-05-09T01:02:09","date_gmt":"2013-05-08T23:02:09","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=472"},"modified":"2022-08-20T18:25:37","modified_gmt":"2022-08-20T16:25:37","slug":"cscope-xcscope-en-emacs","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=472","title":{"rendered":"cscope + xcscope en emacs"},"content":{"rendered":"<p>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.<\/p>\n<p style=\"padding-left: 30px;\"># <strong>apt-get install cscope<\/strong><\/p>\n<p>Por supuesto podemos comenzar a usar cscope desde linea de comandos, para ver la lista completa de opciones podemos ejecutar:<\/p>\n<p style=\"padding-left: 30px;\">$ <strong>cscope &#8211;help<\/strong><\/p>\n<p>Aunque estos son algunos de los argumentos mas tipicos:<\/p>\n<p style=\"padding-left: 30px;\"><strong>-b<\/strong> : construye la referencia cruzada.<\/p>\n<p style=\"padding-left: 30px;\"><strong>-R<\/strong> : crear la base de datos sobre un directorio de manera recursiva.<\/p>\n<p style=\"padding-left: 30px;\"><strong>-v<\/strong> : modo detallado (verbose)<\/p>\n<p>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.<\/p>\n<p>Para usar xcscope realizaremos lo siguiente. Primero debemos bajar xcscope: Lo podeis descargar <strong><span style=\"color: #0000ff;\"><a href=\"http:\/\/inst.eecs.berkeley.edu\/~cs186\/fa05\/debugging\/xcscope.el\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #0000ff;\">aqui<\/span><\/a><\/span><\/strong>. Y meter dicho fichero por ejemplo en <strong>~\/.emacs.d\/xcscope.el<\/strong><\/p>\n<p>Despues de ello tan solo debemos poner lo siguiente en nuestro <strong>.emacs<\/strong>:<\/p>\n<p style=\"padding-left: 30px;\"><em>(load-file \u00ab~\/.emacs.d\/xcscope\/xcscope.el\u00bb)<\/em><br \/>\n<em>(require &#8216;xcscope)<\/em><\/p>\n<p>Ademas de ello, podemos incluir algunos keybindings interesantes (yo lo tengo asignado en las teclas de funcion para evitar conflictos y tenerlo a mano):<\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(ctrl f3)] &#8216;cscope-set-initial-directory)<\/em><\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(ctrl f4)] &#8216;cscope-unset-initial-directory)<\/em><\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(ctrl f5)] &#8216;cscope-find-this-symbol)<\/em><\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(ctrl f6)] &#8216;cscope-find-global-definition)<\/em><\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(ctrl f7)] cscope-find-global-definition-no-prompting)<\/em><\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(ctrl f8)] &#8216;cscope-pop-mark)<\/em><\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(ctrl f9)] &#8216;cscope-next-symbol)<\/em><\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(ctrl f10)] &#8216;cscope-next-file)<\/em><\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(ctrl f11)] &#8216;cscope-prev-symbol)<\/em><\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(ctrl f12)] &#8216;cscope-prev-file)<\/em><\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(meta f9)] &#8216;cscope-display-buffer)<\/em><\/p>\n<p style=\"padding-left: 30px;\"><em>(define-key global-map [(meta f10)] &#8216;cscope-display-buffer-toggle)<\/em><\/p>\n<p>Por supuesto existen keybidings por defecto, que pueden ser comodos para ciertos usuarios, el prefijo que se emplea es <strong>C-c s<\/strong> (y se debe estar en el modo adecuado visualizando codigo fuente obviamente) son los siguientes:<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #000000;\">C-c s s<\/span><\/strong> : busca un simbolo<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #000000;\">C-c s d<\/span><\/strong> : busca definicion global de un simbolo<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #000000;\">C-c s g<\/span><\/strong> : busca un simbolo de manera global<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #000000;\">C-c s G<\/span><\/strong> : busca un simbolo de manera global sin emplear el prompt<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #000000;\"> C-c s c<\/span><\/strong> : busca funciones que llaman dicha funcion<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #000000;\">C-c s C<\/span><\/strong> : busca funciones que son llamadas desde una funcion<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #000000;\">C-c s t<\/span><\/strong> : busca una cadena de texto<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #000000;\">C-c s e<\/span><\/strong> : busca un patron regxp empleando egrep<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #000000;\">C-c s f<\/span><\/strong> : busca un fichero<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s i<\/strong> : busca ficheros incluyendo el fichero header<\/p>\n<p>Los siguientes keybindings se emplean para moverse entre los resultados:<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s b<\/strong> : muestra el buffer *cscope* donde se muestran todos los resultados.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s B<\/strong> : muestra automaticamente el buffer *cscope* (toggle).<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s n<\/strong> : siguiente simbolo<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s N<\/strong> : siguiente fichero<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s p<\/strong> : simbolo anterior<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s P<\/strong> : fichero anterior<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s u<\/strong> : hace pop de la marca actual, es decir sale a un nivel superior de codigo a nivel de llamadas.<\/p>\n<p>Los siguientes keybindings hacen referencia a settear y unsettear\u00a0 la variable <strong>&#8216;cscope-initial-directory&#8217;<\/strong>, (localizacion donde se busca la base de datos para cscope):<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s a<\/strong> : hace set del directorio inicial<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s A<\/strong> : hace unset del directorio inicial<\/p>\n<p>Los siguientes keybindings hacen referencia al mantenimiento de la base de datos de cscope:<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s L<\/strong> : crea la lista de fichero del indice<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s I<\/strong> : crea la lista y el indice<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s E<\/strong> : edita la lista de ficheros del indice<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s W<\/strong> : muestra donde (where) se encuentra el directorio para cscope<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s S<\/strong> : muestra donde (show) se encuentra el buffer del directorio cscope.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s T<\/strong> : localiza este (tell) directorio del buffer de cscope<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c s D<\/strong> : Hace dired the directorio del buffer de cscope<\/p>\n<p>Una vez hecho esto, debemos generar la base de datos, para ello debemos cercionarnos que <strong>cscope-indexer<\/strong> 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).<\/p>\n<p>Ahora podemos ejecutar cscope-indexer en nuestro directorio del proyecto:<\/p>\n<p style=\"padding-left: 30px;\">$ <strong>cd dir_del_proyecto<\/strong><\/p>\n<p style=\"padding-left: 30px;\">$ <strong>cscope-indexer -r -v<br \/>\n<\/strong><\/p>\n<p style=\"padding-left: 30px; text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=476\" rel=\"attachment wp-att-476\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-476\" alt=\"Selection_019\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_019.png\" width=\"645\" height=\"372\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_019.png 645w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_019-300x173.png 300w\" sizes=\"(max-width: 645px) 100vw, 645px\" \/><\/a><\/p>\n<p>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:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=477\" rel=\"attachment wp-att-477\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-477\" alt=\"Selection_020\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_020.png\" width=\"707\" height=\"860\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_020.png 707w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_020-246x300.png 246w\" sizes=\"(max-width: 707px) 100vw, 707px\" \/><\/a><\/p>\n<p>Lo tipico es moverse en una parte de codigo, ponerse encima de la funcion llamada deseada, pulsar <strong>Ctrl+F5<\/strong>, moverse por ese codigo, volver a pulsar <strong>Ctrl+F5<\/strong> en la funcion deseada, volver a ver el listado, movernos hasta la deseada mediante <strong>Ctrl+F9<\/strong> y asi sucesivamente tantos niveles como deseemos, si queremos volver atras a nivel de stack, iriamos pulsando <strong>Ctrl+F8<\/strong>.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[256],"tags":[253,257,165,8,258,255,254],"class_list":["post-472","post","type-post","status-publish","format-standard","hentry","category-medium","tag-cscope","tag-cscope-indexer","tag-editor","tag-emacs","tag-environment","tag-symbols","tag-xcscope"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/472"}],"collection":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=472"}],"version-history":[{"count":6,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/472\/revisions"}],"predecessor-version":[{"id":753,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/472\/revisions\/753"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}