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.
Quelle est la différence (par exemple en termes de fonctionnalités) entre
etags
,ebrowse
,exuberant ctags
,cscope
,GNU Global
etGTags
? Que dois-je faire pour les utiliser dans Emacs ?Ai-je besoin de sémantique / senator (CEDET) si je veux utiliser des balises pour naviguer / compléter automatiquement les symboles?
Qu'apporte la sémantique à la table en plus de ces différents utilitaires de balises? Comment s'interface avec ces outils?
la source
GTags
projet auquel vous vous êtes lié est assez mort. Si quelqu'un en parlegtags
, il fait probablement référence à GNU Global.Réponses:
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:
etags
et lesctags
deux 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 dectags
serait 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.cscope
est 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:
ctags
l'un vous permet d'accéder à la déclaration / aux définitions de symboles (ce que certains appelleraient une recherche à sens unique ).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 m'occupe de projets C / C ++, j'utilise beaucoup
cscope
et je m'en soucie très peuctags
. 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:
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
etags
etcscope
, 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
global
etebrowse
, mais si ma mémoire est bonne, ils ont utilisé etags.la source
cscope
Emacs? J'ai luxcscope.el
sur EmacsWiki ici mais je n'ai pas trouvé de lien vers le fichier. De plus, quel.el
fichier utilisez-vous pour obtenircscope
avec Emacs?xcscope.el
se trouve danscscope/contrib/xcscope/
(ceci étant dans le package de distribution). C'est ce que j'utilise.semantic
comparer aveccscope
? En termes de navigation dans le code source, la sémantique fournit-elle des fonctionnalités quicscope
ne le font pas? Utilisez-vous les deux?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?Je vais essayer d'ajouter quelques explications à 1.
Qu'Est-ce que c'est?
Comparaison
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:
Usage:
(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.
Avec les combinaisons, vous pouvez utiliser cscope pour 41 langues.
Bonne chance!
la source
Les fichiers TAGS contiennent des définitions
Un
TAGS
fichier 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:Cela permet à Emacs de trouver des définitions. La navigation de base est intégrée à
find-tag
, maisetags-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 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
etags
etctags
. Emacs 'ctags
est justeetags
avec la même interface CLI que les ctags universels. Pour éviter toute confusion, de nombreuses distributions renomment ces programmes (par exemplectags.emacs24
sur Debian).Il existe également des outils spécifiques au langage pour générer des fichiers TAGS, tels que
jsctags
ethasktags
.Autres formats de fichiers
ebrowse
est un programme C livré avec Emacs. Il indexe le code C / C ++ et génère unBROWSE
fichier. ebrowse.el fournit la définition et la complétion habituelles de la recherche. Vous pouvez également ouvrir leBROWSE
fichier 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
,GRTAGS
et leGPATH
fichier. Vous pouvez générer ces fichiers avec lagtags
commande, 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.
la source
[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?
TAGS
fichier qui est le format de fichier de balise pour Emacs . Vous pouvez utiliser un fichier Etags avecetags.el
lequel fait partie d'Emacs.Ctags
est le terme générique pour tout ce qui peut générer untags
fichier, qui est le format de fichier de balise natif pour Vi. Universal Ctags (akaUCtags
, anciennement Exuberant Ctags) peut également générer des Etags avec l'-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 le package xcscope.el . Il existe également des interfaces graphiques basées sur Cscope .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
grep
moteur de recherche similaire .less
(pager), Doxygen et n'importe quel navigateur Web.gtags.el
via 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 :
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!
la source
--with-exuberant-ctags=...
alors qu'à partir de 2019, il y a une--with-universal-ctags
option. Devrait-on changer cela pour ce dernier?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:
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.
la source