Tags pour Emacs: Relation entre etags, ebrowse, cscope, GNU Global et ctags exubérants

102

Je travaille sur des projets C ++ et j'ai parcouru le guide d' Alex Ott sur CEDET et d'autres threads sur les balises dans StackOverflow, mais je suis toujours confus sur la façon dont Emacs s'interface avec ces différents systèmes de balises pour faciliter l'autocomplétion, la recherche de définitions, la navigation des sources base de code ou la prévisualisation des doc-strings.

  1. Quelle est la différence (par exemple en termes de fonctionnalités) entre etags, ebrowse, exuberant ctags, cscope, GNU Globalet GTags? Que dois-je faire pour les utiliser dans Emacs ?

  2. Ai-je besoin de sémantique / senator (CEDET) si je veux utiliser des balises pour naviguer / compléter automatiquement les symboles?

  3. Qu'apporte la sémantique à la table en plus de ces différents utilitaires de balises? Comment s'interface avec ces outils?

Amelio Vazquez-Reina
la source
2
À en juger par le tronc , le GTagsprojet auquel vous vous êtes lié est assez mort. Si quelqu'un en parle gtags, il fait probablement référence à GNU Global.
Gordon Gustafson

Réponses:

71

C'est aussi une bonne question que j'ai récemment lue ici, alors je vais essayer d'expliquer la différence plus en détail:

Point 1:

etagset les ctagsdeux génèrent un fichier d'index (aka tag / TAGS) des objets de langage trouvés dans les fichiers source qui permet à ces éléments d'être localisés rapidement et facilement par un éditeur de texte ou un autre utilitaire. Une balise signifie un objet langage pour lequel une entrée d'index est disponible (ou, alternativement, l'entrée d'index créée pour cet objet). Les balises générées par les ctags sont plus riches en métadonnées, mais Emacs ne peut pas interpréter les données supplémentaires de toute façon, vous devriez donc les considérer plus ou moins comme les mêmes (le principal avantage de ctagsserait sa prise en charge de plusieurs langues). La principale utilisation des fichiers de balises consiste à rechercher les déclarations / définitions de classe / méthode / fonction / constante / etc.

cscopeest une bête beaucoup plus puissante (du moins en ce qui concerne C / C ++ et Java). Bien qu'il fonctionne plus ou moins sur le même principe (générer un fichier de métadonnées utiles), il vous permet de faire des choses plus sophistiquées comme trouver toutes les références à un symbole, voir où une fonction est appelée, etc. (vous pouvez également trouver des définitions) .

Résumer:

ctagsl'un vous permet d'accéder à la déclaration / aux définitions de symboles (ce que certains appelleraient une recherche à sens unique ). ctagsest un outil à usage général utile pour de nombreuses langues.

D'autre part (comme mentionné sur la page du projet) cscopevous permet de:

  • Aller à la déclaration d'un symbole
  • Afficher une liste sélectionnable de toutes les références à un symbole
  • Recherchez n'importe quelle définition globale
  • Fonctions appelées par une fonction
  • Fonctions appelant une fonction
  • Rechercher une chaîne de texte
  • Rechercher un modèle d'expression régulière
  • Trouver un fichier
  • Rechercher tous les fichiers, y compris un fichier

Cela ne devrait surprendre personne à ce stade, que lorsque je m'occupe de projets C / C ++, j'utilise beaucoup cscopeet je m'en soucie très peu ctags. Lorsqu'il s'agissait d'autres langues, la situation serait évidemment inversée.

Point 2.

Pour avoir une autocomplétion intelligente, vous avez besoin d'un véritable analyseur de code source (comme sémantique), sinon vous ne connaîtrez pas les types d'objets (par exemple) dans vos applications et les méthodes qui peuvent être appelées sur eux. Vous pouvez avoir une saisie semi-automatique basée sur de nombreuses sources différentes, mais pour obtenir les meilleurs résultats, vous aurez finalement besoin d'un analyseur. Il en va de même pour la coloration syntaxique - actuellement la coloration syntaxique dans les principaux modes d'Emacs est basée simplement sur des expressions régulières et est très fragile et sujette aux erreurs. Espérons qu'avec l'inclusion de la sémantique dans Emacs 23.2 (il s'agissait d'un package externe avant cela), nous commencerons à en voir plus d'utilisations (comme l'utiliser pour analyser un code source de tampon pour le mettre en évidence correctement)

Puisque la sémantique d'Emacs 24.1 est utilisable à partir du cadre de complétion d'Emacs. Le moyen le plus simple de le tester est d'ouvrir un fichier de code source C et de taper M-TABou C-M-iet de regarder la sémantique se terminer automatiquement pour vous. Pour les langages où la sémantique n'est pas activée par défaut, vous pouvez l'ajouter la ligne suivante à votre crochet de mode principal de votre choix:

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

Point 3.

sémantique apporte une véritable conscience du code (pour les quelques langages qu'il prend actuellement en charge) et comble le fossé entre les IDE et Emacs. Cela ne s'interface pas vraiment avec des outils comme etagset cscope, mais cela ne signifie pas que vous ne pouvez pas les utiliser ensemble.

J'espère que mes explications auront du sens et vous seront utiles.

PS Je ne connais pas très bien globalet ebrowse, mais si ma mémoire est bonne, ils ont utilisé etags.

Bozhidar Batsov
la source
1
C'est bien. Merci! Savez-vous comment utiliser cscopeEmacs? J'ai lu xcscope.elsur EmacsWiki ici mais je n'ai pas trouvé de lien vers le fichier. De plus, quel .elfichier utilisez-vous pour obtenir cscopeavec Emacs?
Amelio Vazquez-Reina
1
xcscope.else trouve dans cscope/contrib/xcscope/(ceci étant dans le package de distribution). C'est ce que j'utilise.
Bozhidar Batsov
Encore une question: comment semanticcomparer avec cscope? En termes de navigation dans le code source, la sémantique fournit-elle des fonctionnalités qui cscopene le font pas? Utilisez-vous les deux?
Amelio Vazquez-Reina
4
Je ne crois pas que GNU Global utilise etags, d'ailleurs. IIRC gère et interroge une base de données «appropriée» (plutôt que de scanner un fichier texte plat), ce qui présente de nombreux avantages en termes de performances à la fois pour l'interrogation et (en particulier) pour la mise à jour des balises.
phils
@BozhidarBatsov Quand vous avez dit For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>. Que fait exactement cet extrait de code?
Amelio Vazquez-Reina
45

Je vais essayer d'ajouter quelques explications à 1.

Qu'Est-ce que c'est?

  • Etags est une commande pour générer le fichier 'TAGS' qui est le fichier de balise pour Emacs. Vous pouvez utiliser le fichier avec etags.el qui fait partie du package emacs.
  • Ctags est une commande pour générer un fichier 'tags' qui est le fichier tag pour vi. Désormais, Exuberant Ctags peut générer un fichier 'TAGS' avec l'option -e et prendre en charge 41 langages de programmation.
  • Cscope est un outil de navigation de code source tout-en-un pour le langage C. Il possède ses propres bases de données CUI (interface utilisateur de caractères) et de balises (cscope.in.out, cscope.out, cscope.po.out). Vous pouvez utiliser cscope d'Emacs en utilisant xcscope.el qui fait partie du package cscope.
  • GNU GLOBAL est un système d'étiquetage de code source. Bien qu'il soit similaire aux outils ci-dessus, il en diffère en ce sens qu'il dépend de n'importe quel éditeur et qu'il n'a pas d'interface utilisateur sauf pour la ligne de commande. Gtags est une commande pour générer des fichiers de balises pour GLOBAL (GTAGS, GRTAGS, GPATH). Vous pouvez utiliser GLOBAL depuis emacs en utilisant gtags.el qui fait partie du package GLOBAL. En plus de cela, il existe de nombreuses bibliothèques elisp (xgtags.el, ggtags.el ,thing-gtags.el, helm-gtags.el, etc.).

Comparaison

  • Les ctags et etags ne traitent que les définitions. Cscope et GNU GLOBAL traitent non seulement des définitions mais aussi des références.
  • Ctags et etags utilisent un fichier de balises texte plat. Cscope et GNU GLOBAL utilisent des bases de données de balises clé-valeur.
  • Cscope et GNU GLOBAL ont un moteur de recherche de type grep et une fonction de mise à jour incrémentielle des fichiers de balises.

Combinaison

Vous pouvez combiner le support de langage riche d'Exuberant Ctags et la base de données de GNU GLOBAL en utilisant ctags comme analyseur de plug-in de GLOBAL.

Essayez les solutions suivantes: (nécessite GLOBAL-6.0, Exuberant Ctags-5.5 ou version ultérieure respectivement)

Construire GNU GLOBAL:

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

Usage:

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

(Cependant, vous ne pouvez pas traiter les références par cette méthode, car les ctags ne traitent pas les références.)

Vous pouvez également utiliser cscope en tant que client de GNU GLOBAL. Le paquet GLOBAL inclut une commande nommée 'gtags-cscope' qui est un port de cscope, c'est-à-dire qu'il s'agit de cscope lui-même sauf qu'il utilise GLOBAL comme moteur de recherche au lieu de celui de cscope.

$ gtags-cscope          # this is GLOBAL version of cscope

Avec les combinaisons, vous pouvez utiliser cscope pour 41 langues.

Bonne chance!

Shigio
la source
1
Pour les utilisateurs de Debian et de dérivés comme Ubuntu: La page Web GNU GLOBAL avertit que les paquets .deb fournis avec ces distributions Linux sont datés et ne doivent pas être utilisés. Dans mon cas, GLOBAL était sur la version 5.7.1, et je n'ai pas pu obtenir gtags.el, ggtags.el ou helm-gtags.el pour fonctionner correctement sur Emacs 24. Compiler GNU GLOBAL 6.5 à partir de zéro, avec le support des Ctags exubérants ( J'ai utilisé 5,8) a fonctionné un régal. (Merci pour les excellents pointeurs, @shigio).
Rob
9

Les fichiers TAGS contiennent des définitions

Un TAGSfichier contient une liste des emplacements de définition des fonctions et des classes. Il est généralement placé à la racine d'un projet et ressemble à ceci:

^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

Cela permet à Emacs de trouver des définitions. La navigation de base est intégrée à find-tag, mais etags-selectfournit une interface utilisateur plus agréable lorsqu'il y a plusieurs correspondances.

Vous pouvez également utiliser des fichiers TAGS pour compléter le code. Par exemple, le backend etags de l'entreprise utilise des fichiers TAGS .

Les fichiers TAGS peuvent être créés par différents outils

ctags(anciennement connu sous le nom de «ctags universels» ou «ctags exubérants») peut générer des fichiers TAGS et prend en charge la plus large gamme de langues. Il est activement maintenu sur github.

Emacs est livré avec deux programmes qui génèrent des fichiers TAGS, appelés etagset ctags. Emacs ' ctagsest juste etagsavec la même interface CLI que les ctags universels. Pour éviter toute confusion, de nombreuses distributions renomment ces programmes (par exemple ctags.emacs24sur Debian).

Il existe également des outils spécifiques au langage pour générer des fichiers TAGS, tels que jsctagset hasktags.

Autres formats de fichiers

ebrowseest un programme C livré avec Emacs. Il indexe le code C / C ++ et génère un BROWSEfichier. ebrowse.el fournit la définition et la complétion habituelles de la recherche. Vous pouvez également ouvrir le BROWSEfichier directement dans Emacs pour avoir un aperçu des classes / fonctions définies dans une base de code.

GNU mondial a son propre format de base de données, qui se compose d'un GTAGS, GRTAGSet le GPATHfichier. Vous pouvez générer ces fichiers avec la gtagscommande, qui analyse le code C / C ++. Pour les autres langages, GNU Global peut lire les fichiers générés par les ctags universels.

GNU Global fournit également une interface CLI pour poser des questions plus sophistiquées, comme «où est mentionné ce symbole?». Il est livré avec un package Emacs gtags.el, mais ggtags.el est également populaire pour accéder aux bases de données GNU Global.

Cscope est similaire dans l'esprit à GNU Global: il analyse C / C ++ dans son propre format de base de données. Il peut également répondre à des questions telles que «trouver tous les appelants / appelants de cette fonction».

Voir aussi cette discussion HN comparant global et cscope .

Projets client / serveur

rtags analyse et indexe C / C ++ à l'aide d'un serveur persistant. Il utilise l'analyseur clang, donc il gère très bien C ++. Il est livré avec un package Emacs pour interroger le serveur.

google-gtags était un projet dans lequel un gros fichier TAGS serait stocké sur un serveur. Lorsque vous interrogiez le serveur, il fournissait un sous-ensemble du fichier TAGS correspondant à votre recherche.

Sémantique (CEDET)

Semantic est un package Emacs intégré qui contient un analyseur pour C / C ++, afin qu'il puisse également trouver des définitions. Il peut également importer des données à partir de fichiers TAGS, de bases de données csope et d'autres sources. CEDET inclut également une fonctionnalité de style IDE qui utilise ces données, par exemple la génération de diagrammes UML de hiérarchies de classes.

Wilfred Hughes
la source
7

[réponse mise à jour de shigio ]

Je vais essayer d'ajouter quelques explications à la partie 1 de la question.

Qu'Est-ce que c'est?

  1. Etags génère un TAGSfichier qui est le format de fichier de balise pour Emacs . Vous pouvez utiliser un fichier Etags avec etags.ellequel fait partie d'Emacs.
  2. Ctagsest le terme générique pour tout ce qui peut générer un tagsfichier, qui est le format de fichier de balise natif pour Vi. Universal Ctags (aka UCtags, anciennement Exuberant Ctags) peut également générer des Etags avec l' -eoption.
  3. Cscope est un tout-en-un outil de navigation de code source C (avec le soutien moindre pour C ++ et Java), avec ses propres bases de données d'étiquette ( cscope.in.out, cscope.out, cscope.po.out) et TUI . La prise en charge de Cscope est intégrée à Vim; vous pouvez utiliser Cscope d'Emacs en utilisant le package xcscope.el . Il existe également des interfaces graphiques basées sur Cscope .
  4. GNU GLOBAL (aka Gtags) est encore un autre système de balisage de code source (avec des différences significatives - voir la section suivante), en ce sens qu'il génère également des fichiers de balises.

Comparaison

  • Les Ctags et Etags traitent uniquement les définitions (de, par exemple, des variables et des fonctions). Cscope et Gtags traitent également les références.
  • Les fichiers de balises Ctags et Etags sont plats . Les fichiers de balises Cscope et Gtags sont des bases de données clé-valeur plus puissantes , qui permettent (par exemple) une mise à jour incrémentielle.
  • Cscope et Gtags ont un grepmoteur de recherche similaire .
  • Ctags a un support intégré pour plus de langues et de formats de données: consultez la liste actuelle dans le référentiel des analyseurs Universal Ctags . UCtags a également documenté comment développer votre propre analyseur .
  • Cscope et Gtags sont indépendants de l'éditeur.
  • Gtags ne fournit pas sa propre interface utilisateur, mais peut actuellement (octobre 2016) être utilisé à partir de la ligne de commande (CLI), Emacs et parents, Vi et parents, less(pager), Doxygen et n'importe quel navigateur Web.
  • Gtags fournit gtags.elvia le package GLOBAL, mais il existe également de nombreuses autres extensions elisp, y compris xgtags.el, ggtags.el, tout-gtags.el, helm-gtags.el.

Combinaison

Vous pouvez combiner la prise en charge du langage riche d'Universal Ctags avec la base de données de Gtags et de nombreuses extensions en utilisant Ctags comme analyseur 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

Notez encore que si vous utilisez Ctags comme analyseur pour vos Gtags, vous perdez la capacité de traiter les références (par exemple, l'utilisation de variables, les appels de fonction) que les Gtags fourniraient autrement. Essentiellement, vous échangez le suivi des références de Gtags pour une meilleure prise en charge du langage intégré de Ctags.

Vous pouvez également utiliser Cscope en tant que client de Gtags: gtags-cscope.

Bonne chance!

TomRoche
la source
J'ai lu: "Notez à nouveau que si vous utilisez Ctags comme analyseur pour vos Gtags, vous perdez la possibilité de traiter les références (par exemple, l'utilisation de variables, les appels de fonction) que les Gtags fourniraient autrement. Essentiellement, vous échangez le suivi des références de Gtags contre Une meilleure prise en charge du langage intégré de Ctags. " Est-ce vrai pour les anciens ctags livrés avec Emacs, ou est-ce toujours vrai pour les Universal Ctags? Aussi, j'ai lu "combiner le langage riche d'Universal Ctag" mais dans l'extrait de shell qu'il utilise --with-exuberant-ctags=...alors qu'à partir de 2019, il y a une --with-universal-ctagsoption. Devrait-on changer cela pour ce dernier?
bgoodr
3

Je n'ai pas vérifié, mais selon le manuel CEDET ( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ):

semantic peut utiliser CScope comme back-end pour les recherches de base de données. Pour l'activer, utilisez:

 (semanticdb-enable-cscope-databases)

Cela permettra l'utilisation de cscope pour tous les tampons C et C ++.

CScope sera ensuite utilisé pour les recherches à l'échelle du projet comme sauvegarde lorsque les recherches de base de données sémantiques préexistantes peuvent ne pas avoir analysé tous vos fichiers.

Clément B.
la source
1
Cela ne semble pas fonctionner dans Emacs 24.3.1, en utilisant le CEDET 2.0 vanilla qui l'accompagne (pas de méthode semanticdb-enable-cscope-databases).
Rob