emacs cscope cedet gnu-global

Etiquetas para Emacs: Relación entre etags, ebrowse, cscope, GNU Global y ctags exuberantes



cedet gnu-global (5)

Trabajo en proyectos C ++ y revisé la guía de Alex Ott sobre CEDET y otros hilos sobre etiquetas en StackOverflow, pero todavía estoy confundido acerca de cómo Emacs interactúa con estos diferentes sistemas de etiquetas para facilitar el autocompletado, la búsqueda de definiciones, la navegación de la fuente base de código o la vista previa de doc-strings.

  1. ¿Cuál es la diferencia (por ejemplo, en términos de características) entre etags , ebrowse , exuberant ctags , cscope , GNU Global y GTags ? ¿Qué debo hacer para usarlos en Emacs ?

  2. ¿Necesito semántica / senador (CEDET) si quiero usar etiquetas para navegar / autocompletar símbolos?

  3. ¿Qué aporta la semántica a la mesa sobre estas diferentes utilidades de etiquetas? ¿Cómo se relaciona con estas herramientas?


Los archivos TAGS contienen definiciones

Un archivo TAGS contiene una lista de dónde se definen las funciones y las clases. Por lo general, se coloca en la raíz de un proyecto y se ve así:

^L configure,3945 as_fn_success () { as_fn_return 0; }^?as_fn_success^A180,5465 as_fn_failure () { as_fn_return 1; }^?as_fn_failure^A181,5502 as_fn_ret_success () { return 0; }^?as_fn_ret_success^A182,5539 as_fn_ret_failure () { return 1; }^?as_fn_ret_failure^A183,5574

Esto permite a Emacs encontrar definiciones. La navegación básica está incorporada con find-tag , pero etags-select proporciona una interfaz de usuario más agradable cuando hay varias coincidencias.

También puede usar archivos TAGS para completar el código. Por ejemplo, el backend etags de la compañía usa archivos TAGS .

Los archivos TAGS se pueden construir con diferentes herramientas

ctags (anteriormente conocidos como ''ctags universales'' o ''ctags exuberantes'') pueden generar archivos TAGS y admiten la más amplia gama de idiomas. Se mantiene activamente en github.

Emacs se envía con dos programas que generan archivos TAGS, llamados etags y ctags . Los ctags Emacs son solo etags con la misma interfaz CLI que los ctags universales. Para evitar confusiones, muchas distros renombran estos programas (por ejemplo, ctags.emacs24 en Debian).

También hay herramientas específicas de lenguaje para generar archivos TAGS, como jsctags y hasktags .

Otros formatos de archivo

ebrowse es un programa C enviado con Emacs. Indexa el código C / C ++ y genera un archivo BROWSE . ebrowse.el proporciona la definición y finalización de búsqueda habituales. También puede abrir el archivo BROWSE directamente en Emacs para obtener una visión general de las clases / funciones definidas una base de código.

GNU Global tiene su propio formato de base de datos, que consiste en un GTAGS , GRTAGS y GPATH . Puede generar estos archivos con el comando gtags , que analiza el código C / C ++. Para otros idiomas, GNU Global puede leer archivos generados por ctags universales.

GNU Global también proporciona una interfaz CLI para hacer preguntas más sofisticadas, como ''¿dónde se menciona este símbolo?''. Se envía con un paquete de Emacs gtags.el, pero ggtags.el también es popular para acceder a las bases de datos de GNU Global.

cscope es similar en espíritu a GNU Global: analiza C / C ++ en su propio formato de base de datos. También puede responder preguntas como ''encontrar a todos los que llaman / llaman de esta función''.

Ver también este debate de HN comparando global y cscope .

Proyectos cliente / servidor

rtags analiza e indexa C / C ++ usando un servidor persistente. Utiliza el analizador clang, por lo que maneja C ++ realmente bien. Se envía con un paquete de Emacs para consultar el servidor.

google-gtags era un proyecto en el que se almacenaba un gran archivo TAGS en un servidor. Cuando consultó el servidor, proporcionaría un subconjunto del archivo TAGS que era relevante para su búsqueda.

Semántica (CEDET)

Semántica es un paquete Emacs integrado que contiene un analizador para C / C ++, por lo que también puede encontrar definiciones. También puede importar datos desde archivos TAGS, bases de datos csope y otras fuentes. CEDET también incluye la funcionalidad de estilo IDE que utiliza estos datos, por ejemplo, generar diagramas UML de jerarquías de clase.


En realidad, no lo he comprobado, pero de acuerdo con el manual de CEDET ( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ):

semántica puede usar CScope como un back-end para búsquedas en bases de datos. Para habilitarlo, usa:

(semanticdb-enable-cscope-databases)

Esto permitirá el uso de cscope para todos los búferes C y C ++.

Luego, CScope se usará para búsquedas en todo el proyecto como respaldo cuando las búsquedas de bases de datos semánticas preexistentes pueden no haber analizado todos sus archivos.


Esa es una buena pregunta, como he leído recientemente aquí, así que intentaré explicar la diferencia con más detalle:

Punto 1:

etags ctags como los ctags generan un archivo de índice (aka tag / TAGS) de objetos de lenguaje encontrados en los archivos fuente que permite que estos elementos sean localizados rápida y fácilmente mediante un editor de texto u otra utilidad. Una etiqueta significa un objeto de idioma para el que está disponible una entrada de índice (o, alternativamente, la entrada de índice creada para ese objeto). Las etiquetas generadas por ctags son más ricas en términos de metadatos, pero Emacs no puede interpretar los datos adicionales de todos modos, por lo que debería considerarlos más o menos iguales (la principal ventaja de los ctags sería su compatibilidad con más idiomas). El uso principal de los archivos de etiquetas es buscar clase / método / función / constante / declaración / definiciones.

cscope es una bestia mucho más poderosa (al menos en lo que se refiere a C / C ++ y Java). Si bien funciona con más o menos el mismo principio (generar un archivo de metadatos útiles), le permite hacer cosas más elegantes, como encontrar todas las referencias a un símbolo, ver dónde se invoca una función, etc. (también puede encontrar definiciones) .

En resumen:

ctags one le permite navegar a declaraciones / definiciones de símbolos (lo que algunos llamarían una búsqueda unidireccional ). ctags es una herramienta de propósito general útil para muchos idiomas.

Por otro lado (como se menciona en la página del proyecto) cscope permite:

  • Ir a la declaración de un símbolo
  • Mostrar una lista seleccionable de todas las referencias a un símbolo
  • Busque cualquier definición global
  • Funciones llamadas por una función
  • Funciones que llaman a una función
  • Busque una cadena de texto
  • Busque un patrón de expresión regular
  • Encuentra un archivo
  • Encuentra todos los archivos, incluido un archivo

No debería sorprender a nadie en este momento, que cuando trato con proyectos de C / C ++ hago un uso intensivo de cscope y me importan muy poco los ctags . Al tratar con otros idiomas, la situación obviamente se revertiría.

Punto 2.

Para tener autocompletado inteligente necesita un verdadero analizador de código fuente (como semántica), de lo contrario no sabrá los tipos de los objetos (por ejemplo) en sus aplicaciones y los métodos que pueden invocarse sobre ellos. Puedes tener un autocompletado basado en muchas fuentes diferentes, pero para obtener los mejores resultados necesitarás un analizador. Lo mismo ocurre con el resaltado de sintaxis: actualmente, el resaltado de sintaxis en los modos principales de Emacs se basa simplemente en expresiones regulares y eso es muy frágil y propenso a errores. Afortunadamente con la inclusión de semántica en Emacs 23.2 (antes era un paquete externo) comenzaremos a ver más usos para ella (como usarla para analizar un código fuente de buffer para resaltarlo adecuadamente)

Como la semántica de Emacs 24.1 se puede usar desde el marco de finalización de Emacs. La forma más fácil de probarlo es abrir un archivo de código fuente C y escribir M-TAB o CMi y ver como la semántica completa automágicamente para usted. Para los idiomas en los que la semántica no está habilitada de forma predeterminada, puede agregarla en la línea siguiente a su gancho principal de opción:

(add-to-list ''completion-at-point-functions ''semantic-completion-at-point-function)

Punto 3.

la semántica trae verdadera conciencia del código (para los pocos idiomas que admite actualmente) y cierra la brecha entre los IDE y Emacs. En realidad, no interactúa con herramientas como etags y cscope , pero eso no significa que no puedas usarlas juntas.

Espero que mis explicaciones tengan sentido y te sean útiles.

PD: No estoy muy familiarizado con global y ebrowse , pero si la memoria me sirve, utilizan etags.


Intentaré agregar algunas explicaciones a 1.

¿Qué es?

  • Etags es un comando para generar el archivo ''TAGS'', que es el archivo de etiqueta para Emacs. Puede usar el archivo con etags.el, que es parte del paquete emacs.
  • Ctags es un comando para generar el archivo ''tags'' que es el archivo de etiquetas para vi. Ahora los Ctags exuberantes pueden generar archivos ''TAGS'' mediante la opción -e, y admiten 41 lenguajes de programación.
  • Cscope es una herramienta de exploración de código fuente todo en uno para lenguaje C. Tiene su propia CUI (interfaz de usuario de caracteres) y bases de datos de etiquetas (cscope.in.out, cscope.out, cscope.po.out). Puede usar cscope de Emacs usando xcscope.el que es parte del paquete cscope.
  • GNU GLOBAL es un sistema de etiquetado de código fuente. Aunque es similar a las herramientas anteriores, difiere de ellas en el punto de que depende de cualquier editor, y no tiene interfaz de usuario a excepción de la línea de comandos. Gtags es un comando para generar archivos de etiquetas para GLOBAL (GTAGS, GRTAGS, GPATH). Puede usar GLOBAL desde emacs usando gtags.el que es parte del paquete GLOBAL. Además de esto, hay muchas bibliotecas elisp para él (xgtags.el, ggtags.el, anything-gtags.el, helm-gtags.el, etc.).

Comparación

  • Ctags y etags tratan solo las definiciones. Cscope y GNU GLOBAL tratan no solo definiciones sino también referencias.
  • Ctags y etags usan un archivo de etiqueta de texto plano. Cscope y GNU GLOBAL usan bases de datos de etiquetas de valores-clave.
  • Cscope y GNU GLOBAL tienen un motor de búsqueda grep y una facilidad de actualización incremental de los archivos de etiquetas.

Combinación

Puede combinar el soporte de lenguaje enriquecido de Exuberant Ctags y la base de datos de GNU GLOBAL usando ctags como un analizador de GLOBAL enchufable.

Pruebe lo siguiente: (requiere GLOBAL-6.0, Exuberante Ctags-5.5 o posterior, respectivamente)

Construyendo GNU GLOBAL:

$ ./configure --with-exuberant-ctags=/usr/local/bin/ctags $ sudo make install

Uso:

$ export GTAGSCONF=/usr/local/share/gtags/gtags.conf $ export GTAGSLABEL=ctags $ gtags # invokes Exuberant Ctags internally $ emacs -f gtags-mode # load gtags.el

(Sin embargo, no puede tratar las referencias por este método, porque las ctags no tratan las referencias).

También puede usar cscope como cliente de GNU GLOBAL. El paquete GLOBAL incluye un comando llamado ''gtags-cscope'' que es un puerto de cscope, es decir, es el propio cscope, excepto que usa GLOBAL como motor de búsqueda en lugar del de cscope.

$ gtags-cscope # this is GLOBAL version of cscope

Con las combinaciones, puede usar cscope para 41 idiomas.

¡Buena suerte!


[respuesta actualizada de shigio ]

Trataré de agregar algunas explicaciones a la parte 1 de la pregunta.

¿Qué es?

  1. Etags genera un archivo TAGS que es el formato de archivo de etiqueta para Emacs . Puede usar un archivo Etags con etags.el que es parte de Emacs.
  2. Ctags es el término genérico para todo lo que pueda generar un archivo de tags , que es el formato de archivo de etiqueta nativo para Vi. ctags (también UCtags como UCtags , anteriormente Ctags Exuberantes) también pueden generar Etags con la opción -e .
  3. Cscope es una herramienta de exploración de código fuente todo en uno para C (con menor soporte para C ++ y Java), con sus propias bases de datos de etiquetas ( cscope.in.out , cscope.out , cscope.po.out ) y TUI . El soporte de Cscope está incorporado en Vim; puede usar Cscope de Emacs usando el paquete xcscope.el . También hay GUI basadas en Cscope .
  4. GNU GLOBAL (también Gtags como Gtags ) es otro sistema de etiquetado de código fuente (con diferencias significativas, consulte la siguiente sección), ya que también genera archivos de etiquetas.

Comparación

  • Ctag y Etags tratan solo definiciones (de, por ejemplo, variables y funciones). Cscope y Gtags también tratan referencias.
  • Los archivos de etiquetas de Ctags y Etags son flat . Los archivos de etiquetas Cscope y Gtags son bases de datos de valores-clave más potentes, lo que permite (p. Ej.) Una actualización incremental.
  • Cscope y Gtags tienen un motor de búsqueda similar a grep .
  • Ctags tiene soporte incorporado para más idiomas y formatos de datos: vea la lista actual de repositorios de analizadores de Universal Ctags . UCtags también ha documentado cómo desarrollar su propio analizador .
  • Cscope y Gtags son independientes del editor.
  • Gtags no proporciona su propia interfaz de usuario, pero actualmente (oct 2016) se puede usar desde la línea de comandos (CLI), Emacs y parientes, Vi y parientes, less (buscapersonas), Doxygen y cualquier navegador web.
  • Gtags proporciona gtags.el mediante el paquete GLOBAL, pero también hay muchas otras extensiones elisp, incluidas xgtags.el, ggtags.el, anything-gtags.el, helm-gtags.el.

Combinación

Puede combinar el soporte de lenguaje enriquecido de Universal Ctags con la base de datos de Gtags y numerosas extensiones mediante el uso de Ctags como un analizador de plug-in GLOBAL :

# build GNU GLOBAL ./configure --with-exuberant-ctags=/usr/local/bin/ctags sudo make install # use it export GTAGSCONF=/usr/local/share/gtags/gtags.conf export GTAGSLABEL=ctags gtags # invokes Universal Ctags internally emacs -f gtags-mode # load gtags.el

Tenga en cuenta nuevamente que si usa Ctags como analizador para sus Gtags, pierde la capacidad de tratar referencias (por ejemplo, uso de variables, llamadas a funciones) que los Gtags proporcionarían de lo contrario. Básicamente, intercambias el seguimiento de referencia de Gtags por el mayor soporte de idiomas integrado de Ctags.

También puede usar Cscope como cliente de Gtags: gtags-cscope .

¡Buena suerte!