{"id":584,"date":"2014-03-09T22:27:26","date_gmt":"2014-03-09T20:27:26","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=584"},"modified":"2022-08-20T18:25:37","modified_gmt":"2022-08-20T16:25:37","slug":"gtags-in-emacs","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=584","title":{"rendered":"GTAGS in Emacs"},"content":{"rendered":"<p>GTACS o mas conocido como Global TAGS o simplemente GLOBAL, es una herramienta de GNU (GNU Global).<\/p>\n<p>Si no disponemos de la herramienta global debemos instalarla:<\/p>\n<p style=\"padding-left: 30px;\"># <strong>apt-get install global<\/strong><\/p>\n<p>Ademas de esto, debemos haber bajado alli ggtags (que se puede descargar de\u00a0http:\/\/www.emacswiki.org\/emacs\/GnuGlobal mediante wget):<\/p>\n<p style=\"padding-left: 30px;\">$<strong> wget http:\/\/elpa.gnu.org\/packages\/ggtags-0.7.12.el<\/strong><\/p>\n<p>Por ultimo, en nuestro .emacs debemos anadir lo siguiente:<\/p>\n<p style=\"padding-left: 30px;\"><em>(add-to-list &#8216;load-path \u00ab~\/.emacs.d\/ggtags\/\u00bb)<\/em><br \/>\n<em>(load-file \u00ab~\/.emacs.d\/ggtags\/ggtags-0.7.12.el\u00bb)<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0 (add-hook &#8216;c-mode-common-hook<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (lambda ()<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (when (derived-mode-p &#8216;c-mode &#8216;c++-mode &#8216;java-mode)<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (ggtags-mode 1))))<\/em><\/p>\n<p>Primero nos debemos posicionar en el directorio del proyecto y tan solo debemos ejecutar (con la opcion -v para verbose o con la opcion &#8211;statistics para mostrar estadisticas):<\/p>\n<p style=\"padding-left: 30px;\">$ <strong>gtags &#8211;statistics<\/strong><\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=588\" rel=\"attachment wp-att-588\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-588\" alt=\"gtags1\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags1.png\" width=\"650\" height=\"392\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags1.png 650w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags1-300x180.png 300w\" sizes=\"(max-width: 650px) 100vw, 650px\" \/><\/a><\/p>\n<p>Esto generara 4 ficheros:<\/p>\n<ul>\n<li><span style=\"color: #008080;\">GTAGS<\/span> : TAGS para definiciones<\/li>\n<li><span style=\"color: #008080;\">GRTAGS<\/span> : TAGS para referencias<\/li>\n<li><span style=\"color: #008080;\">GPATH<\/span> : TAGS para ficheros<\/li>\n<li><span style=\"color: #008080;\">GTAGSROOT<\/span> :\u00a0 Si la variable de entorno GTAGSROOT no esta asignada y el fichero GTAGSROOT existe en el mismo directorio que el fichero GTAGS, entonces global asignara GTAGSROOT al contenido del fichero.<\/li>\n<\/ul>\n<p>Ademas debemos tener en cuenta el fichero de configuracion de global, que pueden ser:<\/p>\n<ol>\n<li><span style=\"color: #008080;\">\u2018$HOME\/.globalrc\u2019<\/span> : fichero de configuracion de global para el usuario.<\/li>\n<li><span style=\"color: #008080;\">\u2018\/etc\/gtags.conf\u2019<\/span> : fichero de configuracion de global para el sistema.<\/li>\n<li><span style=\"color: #008080;\">\u2018[sysconfdir]\/gtags.conf\u2019<\/span> : Ditto.<\/li>\n<\/ol>\n<p>Tenemos distintas opciones utiles para este comando:<\/p>\n<ul>\n<li><strong>-i<\/strong> : actualiza los ficheros TAGS de manera incremental.<\/li>\n<li><strong>&#8211;single-update &lt;fichero&gt;<\/strong> : actualiza los TAGS para un solo fichero.<\/li>\n<li><strong>&#8211;acept-dotfiles<\/strong> : acepta ficheros ocultos que por defecto global ignora.<\/li>\n<li><strong>-v<\/strong> : modo verbose<\/li>\n<li><strong>&#8211;statistics<\/strong> : realiza estadisticas<\/li>\n<\/ul>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=589\" rel=\"attachment wp-att-589\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-589\" alt=\"gtags2\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags2.png\" width=\"688\" height=\"348\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags2.png 688w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags2-300x151.png 300w\" sizes=\"(max-width: 688px) 100vw, 688px\" \/><\/a><\/p>\n<p style=\"text-align: center;\">Auto-completion de funciones mediante abbrev con M-C-i<\/p>\n<p>Una vez construidos los ficheros tags o bien podemos usar emacs para movernos entre ellos (tan solo debemos usar <strong>M-.<\/strong> y <strong>M-*<\/strong> para saltar dentro de la definicion o volver al punto anterior. Algunos de los keybindings de Emacs mas importantes son estos:<\/p>\n<ul>\n<li><strong>M-.<\/strong> : encuentra definiciones<\/li>\n<li><strong>M-]<\/strong> : encuentra referencias<\/li>\n<li><strong>M-*<\/strong> : aborta (vuelve al punto previo de la llamada de manera recursiva)<\/li>\n<li><strong>M-n<\/strong> o <strong>M-p<\/strong> : va al siguiente o al anterior TAG<\/li>\n<li><strong>M-o<\/strong> : hace toggle de abbrev completo (en mi caso me funciona <strong>ESC + soltar ESC + TAB <\/strong>o <strong>Meta+Control+i<\/strong>).<\/li>\n<li><strong>M-{<\/strong> o <strong>M-}<\/strong> : previo o siguiente fichero<\/li>\n<\/ul>\n<p>Ademas pulsando <strong>F10<\/strong> podemos ver un nuevo menu para GTAGS.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=590\" rel=\"attachment wp-att-590\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-590\" alt=\"gtags3\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags3.png\" width=\"691\" height=\"866\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags3.png 691w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags3-239x300.png 239w\" sizes=\"(max-width: 691px) 100vw, 691px\" \/><\/a><\/p>\n<p style=\"text-align: center;\">Usando GTAGS en emacs, en este caso M-] para encontrar referencias<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=591\" rel=\"attachment wp-att-591\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-591\" alt=\"gtags4\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags4.png\" width=\"758\" height=\"766\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags4.png 758w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/gtags4-296x300.png 296w\" sizes=\"(max-width: 758px) 100vw, 758px\" \/><\/a><\/p>\n<p style=\"text-align: center;\">Menu mostrado para GTAGS en C-mode (puede realizarse para cualquier modo de programacion) mediante la tecla F10<\/p>\n<p>Sin embargo si desde consola queremos hacer algunos queries tambien podemos hacerlo con global:<\/p>\n<ul>\n<li><strong>global &lt;patron&gt;<\/strong> -&gt; imprime los TAGS que coinciden con el patron.<\/li>\n<li><strong>global -c\u00a0&lt;patron&gt;<\/strong> -&gt; imprime simbolos que comienzan por patron.<\/li>\n<li><strong>global -f &lt;fichero&gt;<\/strong> -&gt; imprime todos los TAGS de ese fichero.<\/li>\n<li><strong>global -u<\/strong> -&gt; actualiza los TAGS de manera incremental.<\/li>\n<li><strong>global -x &lt;patron&gt;<\/strong> -&gt; muestra detalles<\/li>\n<li><strong>global -g &lt;patron&gt;<\/strong> -&gt; muestra en que linea se encuentra el patron especificado<\/li>\n<li><strong>global -r &lt;patron&gt;<\/strong> -&gt; muestra referencias<\/li>\n<\/ul>\n<p>Para mas informacion se puede consultar la pagina man global, man gtags o el manual de global: <a href=\"http:\/\/www.gnu.org\/software\/global\/manual\/global.html\" target=\"_blank\" rel=\"noopener\">http:\/\/www.gnu.org\/software\/global\/manual\/global.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>GTACS o mas conocido como Global TAGS o simplemente GLOBAL, es una herramienta de GNU (GNU Global). Si no disponemos de la herramienta global debemos instalarla: # apt-get install global Ademas de esto, debemos haber bajado alli ggtags (que se puede descargar de\u00a0http:\/\/www.emacswiki.org\/emacs\/GnuGlobal mediante wget): $ wget http:\/\/elpa.gnu.org\/packages\/ggtags-0.7.12.el Por ultimo, en nuestro .emacs debemos anadir [&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":[8,321,324,322,323,316,318,320,317,319,315],"class_list":["post-584","post","type-post","status-publish","format-standard","hentry","category-medium","tag-emacs","tag-emacs-global","tag-emacs-autocompletion","tag-emacs-global-tags","tag-emacs-gtags","tag-ggtags","tag-global","tag-global-tags","tag-gnu-global","tag-gnu-tags","tag-gtags"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/584"}],"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=584"}],"version-history":[{"count":6,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/584\/revisions"}],"predecessor-version":[{"id":744,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/584\/revisions\/744"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}