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

102

Trabajo en proyectos de C ++, y revisé la guía de Alex Ott para 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 cadenas de documentos.

  1. ¿Cuál es la diferencia (por ejemplo, en términos de características) entre etags, ebrowse, exuberant ctags, cscope, GNU Globaly GTags? ¿Qué necesito 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 además de estas diferentes utilidades de etiquetas? ¿Cómo interactúa con estas herramientas?

Amelio Vázquez-Reina
fuente
2
A juzgar por el tronco , el GTagsproyecto al que se vinculó está bastante muerto. Si alguien habla de gtags, probablemente se esté refiriendo a GNU Global.
Gordon Gustafson

Respuestas:

71

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

Punto 1:

etagsy ctagsambos generan un archivo de índice (también conocido como etiqueta / TAGS) de los objetos de lenguaje que se encuentran en los archivos de origen que permite que estos elementos sean localizados rápida y fácilmente por un editor de texto u otra utilidad. Una etiqueta significa un objeto de lenguaje 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 debe considerarlos más o menos iguales (la principal ventaja ctagssería su soporte para más lenguajes). El uso principal de los archivos de etiquetas es buscar clase / método / función / constante / etc declaración / definiciones.

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

Para resumirlo:

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

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

  • 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
  • Buscar una cadena de texto
  • Buscar 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 cscopeintensivo y me preocupo muy poco por ellos ctags. Al tratar con otros idiomas, la situación obviamente se revertirá.

Punto 2.

Para tener autocompletado inteligente, necesita un verdadero analizador de código fuente (como semántico); de lo contrario, no sabrá los tipos de objetos (por ejemplo) en sus aplicaciones y los métodos que se pueden invocar en ellos. Puede tener un autocompletado basado en muchas fuentes diferentes, pero para obtener los mejores resultados, en última instancia, necesitará 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. Con suerte, con la inclusión de semántica en Emacs 23.2 (antes era un paquete externo) comenzaremos a ver más usos para él (como usarlo para analizar un código fuente de búfer para resaltarlo correctamente)

Dado que la semántica de Emacs 24.1 se puede utilizar desde el marco de finalización de Emacs. La forma más fácil de probarlo es abrir un archivo de código fuente en C y escribir M-TABo C-M-iy ver cómo se completa la semántica automáticamente. Para los idiomas donde la semántica no está habilitada de forma predeterminada, puede agregar la siguiente línea a su gancho de modo principal de su elección:

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

Punto 3.

la semántica brinda una verdadera conciencia del código (para los pocos lenguajes que admite actualmente) y cierra la brecha entre los IDE y Emacs. Realmente no interactúa con herramientas como etagsy cscope, pero no significa que no pueda usarlas juntas.

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

PD: no estoy muy familiarizado con globaly ebrowse, pero si la memoria no me falla, hicieron uso de etags.

Bozhidar Batsov
fuente
1
Esto es genial. ¡Gracias! ¿Sabes cómo puedo usarlo cscopeen Emacs? Leí sobre xcscope.elen EmacsWiki aquí, pero no pude encontrar un enlace al archivo. Además, ¿qué .elarchivo usa para obtener cscopecon Emacs?
Amelio Vazquez-Reina
1
xcscope.else encuentra en cscope/contrib/xcscope/(que está en el paquete de distribución). Eso es lo que uso.
Bozhidar Batsov
Una pregunta más: ¿Cómo se semanticcompara con cscope? En términos de navegar a través del código fuente, ¿la semántica proporciona alguna funcionalidad que cscopeno lo haga? ¿Usas ambos?
Amelio Vazquez-Reina
4
No creo que GNU Global use etags, por cierto. IIRC mantiene y consulta una base de datos "adecuada" (en lugar de escanear un archivo de texto plano), que tiene numerosos beneficios de rendimiento tanto para realizar consultas como (especialmente) para actualizar las etiquetas.
phils
@BozhidarBatsov Cuando dijiste For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>. ¿Qué hace exactamente ese fragmento de código?
Amelio Vazquez-Reina
45

Intentaré agregar algunas explicaciones a 1.

¿Qué es?

  • Etags es un comando para generar un archivo 'TAGS' que es el archivo de etiquetas para Emacs. Puede usar el archivo con etags.el que es parte del paquete emacs.
  • Ctags es un comando para generar un archivo de 'etiquetas' que es el archivo de etiquetas para vi. Ahora, Exuberant Ctags puede generar un archivo 'TAGS' mediante la opción -e, y admite 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, se diferencia de ellas en el punto de que depende de cualquier editor y no tiene interfaz de usuario excepto 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 definiciones. Cscope y GNU GLOBAL tratan no solo las definiciones sino también las referencias.
  • Ctags y etags usan un archivo de etiqueta de texto plano. Cscope y GNU GLOBAL utilizan bases de datos de etiquetas de valor-clave.
  • Cscope y GNU GLOBAL tienen un motor de búsqueda similar a grep y una función de actualización incremental de archivos de etiquetas.

Combinación

Puede combinar el soporte de lenguaje enriquecido de Exuberant Ctags y la función de base de datos de GNU GLOBAL utilizando ctags como analizador de complemento de GLOBAL.

Pruebe lo siguiente: (requiere GLOBAL-6.0, Exuberant 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 con este método, porque los ctags no tratan las referencias).

También puede utilizar cscope como cliente de GNU GLOBAL. El paquete GLOBAL incluye un comando llamado 'gtags-cscope' que es un puerto de cscope, es decir, es cscope en sí, 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!

shigio
fuente
1
Para usuarios de Debian y derivados como Ubuntu: La página web GNU GLOBAL advierte que los paquetes .deb que se envían con estas distribuciones de Linux están anticuados y no deben usarse. En mi caso, GLOBAL estaba en la versión 5.7.1, y no pude hacer que gtags.el, ggtags.el o helm-gtags.el funcionaran correctamente en Emacs 24. Compilar GNU GLOBAL 6.5 desde cero, con soporte para Exuberant Ctags ( Usé 5.8) funcionó de maravilla. (Gracias por los excelentes consejos, @shigio).
Rob
9

Los archivos TAGS contienen definiciones

Un TAGSarchivo contiene una lista de dónde se definen las funciones y clases. Por lo general, se coloca en la raíz de un proyecto y tiene este aspecto:

^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 find-tag, pero etags-selectproporciona una interfaz de usuario más agradable cuando hay varias coincidencias.

También puede utilizar archivos TAGS para completar el código. Por ejemplo, el backend etags de la empresa usa archivos TAGS .

Los archivos TAGS se pueden crear con diferentes herramientas

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

Emacs viene con dos programas que generan archivos TAGS, llamados etagsy ctags. Emacs ctagstiene etagsla misma interfaz CLI que los ctags universales. Para evitar confusiones, muchas distribuciones cambian el nombre de estos programas (por ejemplo, ctags.emacs24en Debian).

También existen herramientas específicas del idioma para generar archivos TAGS, como jsctagsy hasktags.

Otros formatos de archivo

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

GNU Global tiene su propio formato de base de datos, que consiste en una GTAGS, GRTAGSy el GPATHarchivo. Puede generar estos archivos con el gtagscomando, que analiza el código C / C ++. Para otros lenguajes, 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 globales de GNU.

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 todas las personas que llaman / destinatarios de esta función".

Vea también esta discusión de HN que compara global y cscope .

Proyectos cliente / servidor

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

google-gtags era un proyecto en el que un archivo TAGS grande se almacenaría en un servidor. Cuando consultara al servidor, le proporcionaría un subconjunto del archivo TAGS que era relevante para su búsqueda.

Semántica (CEDET)

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

Wilfred Hughes
fuente
7

[respuesta actualizada de shigio 's]

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

¿Qué es?

  1. Etags genera un TAGSarchivo que es el formato de archivo de etiquetas para Emacs . Puede utilizar un archivo Etags con el etags.elque forme parte de Emacs.
  2. Ctagses el término genérico para cualquier cosa que pueda generar un tagsarchivo, que es el formato de archivo de etiqueta nativo para Vi. Universal Ctags (también conocido UCtagscomo Exuberant Ctags) también puede generar Etags con la -eopción.
  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 la UIS . El soporte de Cscope está integrado en Vim; puede usar Cscope de Emacs usando el paquete xcscope.el . También hay GUI basadas en Cscope .
  4. GNU GLOBAL (también conocido 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

  • Ctags y Etags tratan solo definiciones (de, por ejemplo, variables y funciones). Cscope y Gtags también tratan las referencias.
  • Los archivos de etiquetas Ctags y Etags son planos . Los archivos de etiquetas Cscope y Gtags son bases de datos de valor-clave más poderosas , lo que permite (por ejemplo) la actualización incremental.
  • Cscope y Gtags tienen un grepmotor de búsqueda similar.
  • Ctags tiene soporte integrado para más idiomas y formatos de datos: consulte la lista actual en el repositorio 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 (octubre de 2016) se puede utilizar desde la línea de comandos (CLI), Emacs y parientes, Vi y parientes, less(pager), Doxygen y cualquier navegador web.
  • Gtags se proporciona a gtags.eltravés del paquete GLOBAL, pero también hay muchas otras extensiones de 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 función de base de datos de Gtags y numerosas extensiones utilizando Ctags como un analizador de complementos 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 las referencias (por ejemplo, uso de variables, llamadas a funciones) que Gtags proporcionaría de otra manera. Básicamente, intercambias el seguimiento de referencias de Gtags por el mayor soporte de idiomas integrado de Ctags.

También puede utilizar Cscope como cliente de generar GTAGS: gtags-cscope.

¡Buena suerte!

TomRoche
fuente
Leí: "Tenga en cuenta de nuevo que si usa Ctags como analizador de sus Gtags, pierde la capacidad de tratar las referencias (p. Ej., Uso de variables, llamadas a funciones) que de otro modo proporcionaría Gtags. Básicamente, intercambia el seguimiento de referencias de Gtags por El mayor soporte de lenguaje integrado de Ctags ". ¿Es eso cierto para los viejos ctags enviados con Emacs, o sigue siendo cierto para Universal Ctags? Además, leí "combinar el lenguaje enriquecido de Universal Ctag" pero en el fragmento de shell que usa --with-exuberant-ctags=...cuando ahora a partir de 2019 hay una --with-universal-ctagsopción. ¿Debería cambiarse eso a lo último?
bgoodr
3

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

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

 (semanticdb-enable-cscope-databases)

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

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

Clément B.
fuente
1
Esto no parece funcionar en Emacs 24.3.1, usando el CEDET 2.0 vanilla que viene con él (sin el método semanticdb-enable-cscope-database).
Rob