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.
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 ?
Ai-je besoin de sémantique/sénateur (CEDET) si je veux utiliser des balises pour naviguer/symboles de saisie semi-automatique?
Qu'apporte la sémantique au-dessus de ces différents utilitaires de balises? Comment interagit-il avec ces outils?
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:
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.
Je vais essayer d'ajouter quelques explications à 1.
Qu'est-ce que c'est?
Comparaison
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!
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 .
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
.
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 .
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.
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.
[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?
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.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.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 .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
grep
.less
(pager), Doxygen et tout navigateur Web.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!
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.