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.
¿Cuál es la diferencia (por ejemplo, en términos de características) entre
etags
,ebrowse
,exuberant ctags
,cscope
,GNU Global
yGTags
? ¿Qué necesito hacer para usarlos en Emacs ?¿Necesito semántica / senador (CEDET) si quiero usar etiquetas para navegar / autocompletar símbolos?
¿Qué aporta la semántica a la mesa además de estas diferentes utilidades de etiquetas? ¿Cómo interactúa con estas herramientas?
fuente
GTags
proyecto al que se vinculó está bastante muerto. Si alguien habla degtags
, probablemente se esté refiriendo a GNU Global.Respuestas:
Esa es una buena pregunta que he leído aquí recientemente, así que intentaré explicar la diferencia con más detalle:
Punto 1:
etags
yctags
ambos 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 ventajactags
serí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.cscope
es 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:
ctags
uno le permite navegar a las 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) le
cscope
permite:No debería sorprender a nadie en este momento, que cuando trato con proyectos de C / C ++ hago un uso
cscope
intensivo y me preocupo muy poco por ellosctags
. 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:
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
etags
ycscope
, pero no significa que no pueda usarlas juntas.Espero que mis explicaciones tengan sentido y te sean útiles.
PD: no estoy muy familiarizado con
global
yebrowse
, pero si la memoria no me falla, hicieron uso de etags.fuente
cscope
en Emacs? Leí sobrexcscope.el
en EmacsWiki aquí, pero no pude encontrar un enlace al archivo. Además, ¿qué.el
archivo usa para obtenercscope
con Emacs?xcscope.el
se encuentra encscope/contrib/xcscope/
(que está en el paquete de distribución). Eso es lo que uso.semantic
compara concscope
? En términos de navegar a través del código fuente, ¿la semántica proporciona alguna funcionalidad quecscope
no lo haga? ¿Usas ambos?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?Intentaré agregar algunas explicaciones a 1.
¿Qué es?
Comparación
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:
Uso:
(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.
Con las combinaciones, puede usar cscope para 41 idiomas.
¡Buena suerte!
fuente
Los archivos TAGS contienen definiciones
Un
TAGS
archivo 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:Esto permite a Emacs encontrar definiciones. La navegación básica está incorporada
find-tag
, peroetags-select
proporciona 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
etags
yctags
. Emacsctags
tieneetags
la misma interfaz CLI que los ctags universales. Para evitar confusiones, muchas distribuciones cambian el nombre de estos programas (por ejemplo,ctags.emacs24
en Debian).También existen herramientas específicas del idioma para generar archivos TAGS, como
jsctags
yhasktags
.Otros formatos de archivo
ebrowse
es un programa en C enviado con Emacs. Indexa el código C / C ++ y genera unBROWSE
archivo. ebrowse.el proporciona la definición y finalización de búsqueda habitual. También puede abrir elBROWSE
archivo 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
,GRTAGS
y elGPATH
archivo. Puede generar estos archivos con elgtags
comando, 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.
fuente
[respuesta actualizada de shigio 's]
Intentaré agregar algunas explicaciones a la parte 1 de la pregunta.
¿Qué es?
TAGS
archivo que es el formato de archivo de etiquetas para Emacs . Puede utilizar un archivo Etags con eletags.el
que forme parte de Emacs.Ctags
es el término genérico para cualquier cosa que pueda generar untags
archivo, que es el formato de archivo de etiqueta nativo para Vi. Universal Ctags (también conocidoUCtags
como Exuberant Ctags) también puede generar Etags con la-e
opción.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 .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
grep
motor de búsqueda similar.less
(pager), Doxygen y cualquier navegador web.gtags.el
travé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 :
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!
fuente
--with-exuberant-ctags=...
cuando ahora a partir de 2019 hay una--with-universal-ctags
opción. ¿Debería cambiarse eso a lo último?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:
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.
fuente