Tags pour Emacs: relation entre etags, ebrowse, cscope, GNU Global et exubérant ctags

Je travaille sur des projets C++, et j'ai parcouru le guide D'Alex Ott pour CEDET et d'autres threads 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 l'autocomplétion, la recherche de définitions, la navigation de la base de

  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'est-ce que la sémantique apporte à la table au-dessus de ces différents utilitaires de balise? Comment fonctionne l'interface avec ces outils?

88
demandé sur Wilfred Hughes 2012-10-16 23:59:19

5 réponses

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 tous deux génèrent un fichier d'index (alias 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 langue pour lequel une entrée d'index est disponible (ou, alternativement, l'entrée d'index créée pour cet objet). Balise générés par ctags sont plus riches en termes de 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 les mêmes (le principal avantage de ctags serait son support pour plus de langues). L'utilisation principale pour les fichiers de balises est la recherche de classe / méthode / fonction / constante / etc déclaration / définitions.

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

Pour résumer:

ctags on vous permet de naviguer vers la déclaration de symboles/définitions (ce que certains appelleraient une recherche unidirectionnelle). ctags est un outil d'usage général utile pour de nombreuses langues.

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

  • Aller à la déclaration d'un symbole
  • affiche 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
  • recherche d'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

Il ne devrait être surprenant à personne à ce stade, que lorsque je traiter avec des projets c / c++ j'utilise beaucoup cscope et je me soucie très peu de ctags. En ce qui concerne les autres langues, la situation serait évidemment inversée.

Point 2.

Pour avoir une complétion automatique intelligente, vous avez besoin d'un véritableanalyseur 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 complétion automatique basée sur de nombreux sources, mais pour obtenir les meilleurs résultats, vous aurez besoin d'un analyseur. Il en va de même pour la coloration syntaxique - actuellement la coloration syntaxique dans les modes principaux Emacs est basée simplement sur des expressions régulières et c'est très fragile et sujet aux erreurs. Espérons qu'avec l'inclusion de sémantique dans Emacs 23.2 (c'était un paquet externe avant cela), nous allons commencer à voir plus d'utilisations pour cela (comme l'utiliser pour analyser un code source de tampon pour le mettre en évidence correctement)

Depuis Emacs 24.1 sémantique est utilisable du cadre d'achèvement 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 de regarder comme sémantique automagiquement terminé pour vous. Pour les langues où la sémantique n'est pas activée par défaut, vous pouvez ajouter la ligne suivante à votre 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 prise de conscience du code (pour les quelques langages qu'elle supporte actuellement) et comble l'écart 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 suis pas tout à fait familier avec global et ebrowse, mais si la mémoire me sert, ils ont utilisé des etags.

61
répondu Bozhidar Batsov 2012-10-17 05:52:25

, je vais essayer d'ajouter quelques explications à 1.

Qu'y a-t-il?

  • Etags est une commande pour générer le fichier 'TAGS' qui est le fichier tag pour Emacs. Vous pouvez utiliser le fichier avec etags.el qui fait partie du paquet emacs.
  • Ctags est une commande pour générer le fichier 'tags' qui est le fichier tag pour vi. maintenant exubérant Ctags peut générer le fichier 'TAGS' par l'option-e, et supporte 41 langages de programmation.
  • Cscope est un outil de navigation de code source tout-en-un pour C langue. Il a sa propre cui (interface utilisateur de caractère) et des bases de données de balises (cscope. in. out, cscope.hors, cscope.po.hors). Vous pouvez utiliser cscope à partir D'Emacs en utilisant xcscope.el qui fait partie du paquet cscope.
  • GNU GLOBAL est un système de marquage de code source. Bien qu'il soit similaire aux outils ci-dessus, il en diffère au point qu'il dépend de n'importe quel éditeur, et 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 à partir d'emacs à l'aide de gtags.el qui fait partie du paquet GLOBAL. En plus de cela, il existe de nombreuses bibliothèques elisp pour cela (xgtags.el, ggtags.el, n'importe quoi-gtags.el, barre-gtags.el, etc).

Comparaison

  • Les ctags et les 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 balise texte plat. Cscope et GNU GLOBAL utilisent des bases de données de balise clé-valeur.
  • Cscope et GNU GLOBAL ont un grep comme moteur de recherche et mise à jour incrémentale des fichiers de balises.

Combinaison

Vous pouvez combiner le support de langage riche de ctags exubérant et la facilité de base de données de GNU GLOBAL en utilisant ctags comme un analyseur de plug-in de GLOBAL.

Essayez les éléments suivants: (nécessite GLOBAL-6.0, exubérant Ctags-5.5 ou version ultérieure respectivement)

Construire GNU GLOBAL:

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

Utilisation:

$ 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, parce que les ctags ne traitent pas les références.)

Vous pouvez également utiliser cscope en tant que client de GNU GLOBAL. Le paquet GLOBAL comprend 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!

39
répondu shigio 2013-03-02 01:18:17

Les fichiers de balises contiennent des définitions

Un fichier TAGS contient une liste 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. Navigation de base est intégré avec find-tag, mais etags-select fournit une INTERFACE utilisateur plus agréable quand il y a plusieurs correspondances.

Vous pouvez également utiliser des fichiers de balises pour compléter le code. Par exemple, le moteur etags de la société utilise des balises les fichiers.

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

ctags (anciennement connu sous le nom de "universal ctags" ou "exubérant ctags") peut générer des fichiers de TAGS et prend en charge le plus large éventail de langues. Il est activement maintenu sur github.

Emacs est livré avec deux programmes qui génèrent des fichiers de balises, appelés etags et ctags. ctags d'Emacs est juste etags avec la même interface CLI que Universal ctags. 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 de balises, 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'une GTAGS, GRTAGS et GPATH fichier. 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 universal ctags.

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 paquet Emacs gtags.el, mais ggtags.el {[25] } est également populaire pour accéder à GNU Global les bases de données.

Cscope est similaire dans L'esprit de 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 / callees de ce funciton".

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 paquet Emacs à interrogez le serveur.

Google-gtags {[25] } était un projet où un fichier de balises volumineux serait stocké sur un serveur. Lorsque vous interrogez le serveur, il fournit un sous-ensemble du fichier de balises pertinent pour votre recherche.

Sémantique (CEDET)

Semantic est un paquet Emacs intégré qui contient un analyseur pour C / C++, donc il peut aussi 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 des fonctionnalités de style IDE cela utilise ces données, par exemple en générant des diagrammes UML de hiérarchies de classes.

7
répondu Wilfred Hughes 2016-10-04 19:48:44

[de réponses mis à jour à partir de shigio's]

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

Quel est-il?

  1. Etags génère un fichier TAGSqui est le format de fichier de balise pour Emacs. Vous pouvez utiliser un fichier Etags avec etags.el qui fait partie D'Emacs.
  2. {[3] } est le terme générique pour tout ce qui peut générer un fichier tags, qui est le format de fichier tag natif pour Vi. Universal Ctags (alias UCtags, anciennement exubérant Ctags) peut également générer des Etags avec l'option -e.
  3. Cscope {[18] } 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 à partir D'Emacs en utilisant xcscope.paquet el . Il existe également des interfaces graphiques basées sur Cscope .
  4. GNU GLOBAL (alias Gtags) est encore un autre système de marquage 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 les Etags ne traitent que les définitions (des variables et des fonctions, par exemple). Cscope et Gtags traitent également les références.
  • les fichiers de balises Ctags et Etags sont plats . Les tagfiles Cscope et Gtags sont des bases de données clé-valeur plus puissantes, ce qui permet (par exemple) une mise à jour incrémentale.
  • Cscope et les Gtags ont un moteur de recherche similaire à grep.
  • Ctags prend en charge plusieurs langages et formats de données: voir la liste des analyseurs ctags universels en cours dans le référentiel. 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 tout navigateur web.
  • Gtags fournit gtags.el via le paquet GLOBAL, mais il existe également de nombreuses autres extensions elisp, y compris xgtags.el, ggtags.el, n'importe quoi-gtags.el, barre-gtags.El.

Combinaison

Vous pouvez combiner la prise en charge du langage riche de Universal Ctags avec la fonction de base de données de Gtags et de nombreuses extensions en utilisant Ctags comme analyseur global de plug-in :

# 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 parser pour vos Gtags, vous perdez la possibilité de traiter les références (par exemple, l'utilisation de variables, les appels de fonctions) que les Gtags fourniraient autrement. Essentiellement, vous négociez le suivi de référence de Gtags pour un plus grand support de langage intégré de Ctags.

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

Bonne chance!

5
répondu TomRoche 2016-10-06 21:35:04

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 bases 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 en tant que sauvegarde lorsque les recherches de bases de données sémantiques préexistantes peuvent ne pas avoir analysé tous vos fichiers.

3
répondu Clément B. 2013-02-24 20:42:36