web-dev-qa-db-fra.com

Tags pour Emacs: Relation entre etags, ebrowse, cscope, GNU Ctags globaux et exubérants

Je travaille sur des projets C++ et j'ai parcouru le guide d'Alex Ott pour CEDET et d'autres discussions sur les balises dans StackOverflow, mais je suis toujours confus quant à la façon dont Emacs s'interface avec ces différents systèmes de balises pour faciliter la saisie semi-automatique, la recherche de définitions, la navigation dans la base de code source ou la prévisualisation de chaînes de documents.

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

  2. Ai-je besoin de sémantique/sénateur (CEDET) si je veux utiliser des balises pour naviguer/symboles de saisie semi-automatique?

  3. Qu'apporte la sémantique au-dessus de ces différents utilitaires de balises? Comment interagit-il avec ces outils?

97

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

Point 1:

etags et ctags génèrent tous deux un fichier d'index (a.k.a. tag/TAGS) d'objets de langage trouvés dans les fichiers source qui permet à ces éléments d'être rapidement et facilement localisés par un éditeur de texte ou un autre utilitaire. Une balise signifie un objet de 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 ctags sont plus riches en termes de métadonnées, mais Emacs ne peut de toute façon pas interpréter les données supplémentaires, vous devriez donc les considérer plus ou moins les mêmes (le principal avantage de ctags serait son support pour plus de langues) . La principale utilisation des fichiers de balises consiste à rechercher des déclarations/définitions de classe/méthode/fonction/constante/etc.

cscope est une bête beaucoup plus puissante (au moins en ce qui concerne C/C++ et Java sont concernés). Bien qu'il fonctionne plus ou moins sur le même principe (génération d'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 invoquée, etc. (vous pouvez également trouver des définitions).

Résumer:

ctags one vous permet de naviguer vers la déclaration/définition des symboles (ce que certains appellent une recherche unidirectionnelle). ctags est un outil à usage général utile pour de nombreuses langues.

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

  • Aller à la déclaration d'un symbole
  • Afficher une liste sélectionnable de toutes les références à un symbole
  • Rechercher une 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
  • Trouver tous les fichiers, y compris un fichier

Cela ne devrait surprendre personne à ce stade, que lorsque je traite des projets C/C++, j'utilise beaucoup de cscope et je me soucie très peu de ctags. Dans le cas d'autres langues, la situation serait évidemment inversée.

Point 2.

Pour avoir une saisie automatique intelligente, vous avez besoin d'un vrai 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 invoqué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 mise en évidence de la syntaxe - actuellement, la mise en évidence de la syntaxe dans les principaux modes Emacs est basée simplement sur des expressions régulières et c'est très fragile et sujet aux erreurs. Avec un peu de chance, avec l'inclusion de la sémantique dans Emacs 23.2 (il s'agissait auparavant d'un package externe), nous commencerons à en voir d'autres utilisations (comme l'utiliser pour analyser un code source de tampon pour le mettre correctement en évidence)

Depuis Emacs 24.1 sémantique est utilisable à partir du cadre de complétion Emacs. Le moyen le plus simple de le tester est d'ouvrir un fichier de code source C et de taper M-TAB ou C-M-i et regardez la sémantique se terminer automatiquement pour vous. Pour les langues 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 choix:

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

Point 3.

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

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

P.S. Je ne connais pas très bien global et ebrowse, mais si la mémoire est bonne, ils ont utilisé des etags.

67
Bozhidar Batsov

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 tag 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, les Ctags exubérants peuvent générer le fichier 'TAGS' par 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 sa propre CUI (interface utilisateur de caractères) et ses bases de données 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 de balisage de code source. Bien qu'il soit similaire aux outils ci-dessus, il en diffère par le fait qu'il dépend de n'importe quel éditeur et qu'il n'a pas d'interface utilisateur à l'exception de 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 à partir d'emacs en utilisant gtags.el qui fait partie du package GLOBAL. En plus de cela, il existe de nombreuses bibliothèques elisp pour cela (xgtags.el, ggtags.el, everything-gtags.el, helm-gtags.el, etc.).

Comparaison

  • Ctags et etags ne traitent que les définitions. Cscope et GNU GLOBAL traitent non seulement les définitions mais aussi les références.
  • Ctags et etags utilisent un fichier de balises de 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 comme grep et une mise à jour incrémentielle des fichiers de balises.

Combinaison

Vous pouvez combiner la prise en charge du langage riche d'Exuberant Ctags et la fonction de base de données de GLOBAL GNU) en utilisant ctags comme analyseur de plug-in de GLOBAL.

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

Construction 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 package GLOBAL inclut une commande nommée 'gtags-cscope' qui est un port de cscope, c'est-à-dire que c'est 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!

40
shigio

Les fichiers TAGS contiennent des définitions

Un fichier TAGS contient une liste des endroits où les fonctions et les classes sont définies. 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 avec find-tag, mais etags-select fournit 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 back-end etags de la société utilise des fichiers TAGS .

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

ctags (anciennement appelé "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 etags et ctags. ctags d'Emacs est simplement etags avec la même interface CLI que les ctags universels. Pour éviter toute confusion, de nombreuses distributions renomment ces programmes (par exemple ctags.emacs24 sur Debian).

Il existe également des outils spécifiques à la langue pour générer des fichiers TAGS, tels que jsctags et hasktags .

Autres formats de fichiers

ebrowse est un programme C livré avec Emacs. Il indexe le code C/C++ et génère un fichier BROWSE. ebrowse.el fournit la définition et l'achèvement habituels de la recherche. Vous pouvez également ouvrir le fichier BROWSE directement dans Emacs pour obtenir un aperçu des classes/fonctions définies dans une base de code.

GNU Global a son propre format de base de données, qui se compose d'un fichier GTAGS, GRTAGS et GPATH. Vous pouvez générer ces fichiers avec la commande gtags, qui analyse le code C/C++. Pour les autres langues, GNU Global peut lire les fichiers générés par des ctags universels.

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

Cscope est similaire dans son esprit à GNU Global: il analyse C/C++ dans son propre format de base de données. Il peut également répondre à des questions comme "trouver tous les appelants/appelants de ce funciton '.

Voir aussi cette discussion HN comparant global et cscope .

Projets client/serveur

rtags analyse et indexe C/C++ en utilisant 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 où un gros fichier TAGS serait stocké sur un serveur. Lorsque vous interrogiez le serveur, il fournissait un sous-ensemble du fichier TAGS qui était pertinent pour 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 comprend également la fonctionnalité de style IDE qui utilise ces données, par exemple la génération de diagrammes UML de hiérarchies de classes.

8
Wilfred Hughes

[réponse mise à jour par shigio s]

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 fichier TAGS qui est le format de fichier de balises pour Emacs . Vous pouvez utiliser un fichier Etags avec etags.el qui fait partie d'Emacs.
  2. Ctags est le terme générique pour tout ce qui peut générer un fichier tags, qui est le format de fichier de balise natif pour Vi. niversal Ctags (aka UCtags, anciennement Exuberant Ctags) peut également générer des Etags avec le -e option.
  3. Cscope est un outil de navigation de code source tout-en-un pour C (avec un support moindre pour C++ et Java), avec ses propres bases de données de balises (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 package xcscope.el . Il existe également 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 importantes - voir la section suivante), en ce qu'il génère également des fichiers de balises.

Comparaison

  • Ctags et Etags ne traitent que les définitions (par exemple des variables et des fonctions). Cscope et Gtags traitent également les références.
  • Les fichiers de balises Ctags et Etags sont flat . Les fichiers de balises Cscope et Gtags sont plus puissants bases de données de valeurs-clés , ce qui permet (par exemple) une mise à jour incrémentielle.
  • Cscope et Gtags ont un moteur de recherche semblable à grep.
  • Ctags a un support intégré pour plus de langues et de formats de données: voir le courant-dans-référentiel liste 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 apparentés, Vi et apparentés, less (pager), Doxygen et tout navigateur Web.
  • Gtags fournit gtags.el via le package GLOBAL, mais il existe également de nombreuses autres extensions elisp, notamment xgtags.el, ggtags.el, everything-gtags.el, helm-gtags.el.

Combinaison

Vous pouvez combiner la prise en charge du langage riche d'Universal Ctags avec la fonction de 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 à 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 de référence 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!

5
TomRoche

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

sémantique 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 bases de données sémantiques préexistantes peuvent ne pas avoir analysé tous vos fichiers.

3
Clément B.