web-dev-qa-db-fra.com

Existe-t-il une alternative aux ctags qui fonctionne mieux?

Je viens de découvrir le plugin taglist pour vim, et en savoir plus sur comment l'utiliser avec ctags .

Cependant, ctags est un analyseur très simple.

Existe-t-il une alternative plus complète?

Plus précisément, je recherche quelque chose qui:

  • développe les macros de style #define(x, y) x ## y pour les déclarations de fonctions

  • processus #include déclarations

  • permet de spécifier les chemins d'inclusion pour les dépendances

Je vois que clang fournit une API programmatique pour accéder au c AST, donc ce n'est certainement pas très difficile à faire?

Quelqu'un l'a-t-il déjà fait?

-

Éditer:

Ceux-ci ne le coupent pas:

  • clang_indexer - Ne compile pas; quand il le fait (après le piratage), ne fonctionne pas (erreurs sans fin).

  • clang_complete - Cela ne semble pas mieux que les ctags. Aucune recommandation spécifique au contexte, aucune complétion de structure, aucun argument de fonction, aucune expansion de macro; juste une liste de symboles et le fichier dont ils proviennent.

38
Doug

J'ai passé pas mal de temps à me débattre avec ça moi-même.

Le plus proche que j'ai jamais obtenu était quelque chose appelé gccsense . Malheureusement, le projet semble abandonné et de plus il a été difficile de le mettre en place car l'anglais n'était pas la langue première de l'auteur.

J'ai fini par aborder le problème sous un autre angle. J'ai pris la décision qu'intellisense/autocomplete était plus important pour mon codage que d'avoir toutes les fonctionnalités disponibles de vim, j'ai donc choisi un IDE comme Eclipse, puis j'ai trouvé un plugin pour Eclipse qui émule Vim Jusqu'à présent, le meilleur type de plugin comme celui que j'ai trouvé était Viable .

Voici la liste complète des options que j'ai essayées et que j'ai trouvées insatisfaisantes:

  • clang - vous oblige à passer de gcc à un compilateur différent et "meilleur". Le problème est que gcc est beaucoup plus mature [ edit apparemment, vous n'avez pas besoin de changer de compilateur voir les commentaires ci-dessous, je pourrais faire un autre essai dans le futur .]
  • gccsense - excellente idée (utiliser gcc pour compléter le code) mais le travail sur le projet est abandonné: (et la version qui est en place est de qualité bêta
  • xref in vim - xref est un excellent outil autonome et fonctionne très bien pour l'analyse C.Il peut être fait pour fonctionner en vim avec vxref , mais d'après mon expérience, xref manque d'analyse le code C++ actuel et le développement sur celui-ci se sont arrêtés (ainsi que le développement sur vxref.)
  • eclim - semble fonctionner très bien pour Java utilisant Eclipse, extrêmement lent et totalement peu fiable lors de l'analyse du code C++ ou C. Ce qui se passe généralement, c'est que tout fonctionne pendant un long moment, mais soudainement, l'analyseur arrête d'analyser tout nouveau code que vous écrivez, et rien de moins que de charger Eclipse lui-même et de forcer Eclipse à analyser le projet semble aider. De plus, un fait moins important, mais plus ennuyeux, c'est qu'eclim prend le relais des erreurs de gestion, donc il fout la façon dont vim analyse habituellement les erreurs de gcc, ce qui signifie que vous n'avez pas accès à la liste des correctifs rapides, ce qui est ennuyeux.
  • netbeans + jvi - beaucoup de gens ne jurent que par ça, mais j'ai eu toutes sortes de problèmes avec jvi. Un problème majeur que j'ai eu était que jvi disait que je suis en mode normal, mais que j'étais vraiment en mode insertion, rien de moins qu'un redémarrage aiderait.
  • Eclipse + viplugin/vrapper - cela commençait à ressembler à la meilleure option; chacun avait son propre ensemble de bogues + des fonctionnalités manquantes, mais c'était toujours le plus attrayant, jusqu'à ce que je trouve viable qui semblait être le plus stable et avoir le plus de fonctionnalités.

Si vous trouvez une solution qui vous convient, partagez-la dans un commentaire, car cela m'intéresserait.

24
ldog

Je n'ai pas encore essayé cela moi-même, mais clang_indexer semble très proche de ce que vous recherchez ( sources ). Il utilise toujours une base de données externe (c'est-à-dire qu'il n'indexe pas à la volée en soi), mais il semble offrir des fonctionnalités que l'on ne trouve généralement que dans cscope (qui ne supporte pas trop bien C++).

Pour la saisie semi-automatique, j'utilise clang_complete . Cela ne nécessite pas de générer un index et fonctionne la plupart du temps plutôt bien. Il peut également effectuer une vérification automatique de la syntaxe dans vim afin d'être averti des problèmes possibles. Il ne complète pas automatiquement l'exemple de macro que vous avez donné

#define blah(x) blah__ ## x
void blah_<TAB>

comme bla__x cependant (seulement comme blah(x)). Ce serait bien que cela soit plus configurable, mais je ne considérerais pas cela non plus comme cassé.

7
Benjamin Bannier

CScout la version 2.8 offre une option de ligne de commande (-C) qui créera un fichier de balises compatible vim pour le code source C qu'il traitera. CScout est un analyseur de code source et un navigateur de refactoring pour des collections de programmes C. Il peut traiter les espaces de travail de plusieurs projets en mappant la complexité introduite par le préprocesseur C dans les fichiers de code source C d'origine. Par conséquent, le fichier de balises généré contient des informations correctes pour les entités, telles que les fonctions, les variables et les structures, qui sont créées via des macros de préprocesseur. CScout traitera les fichiers d'inclusion, en utilisant les chemins de fichier d'inclusion spécifiés dans le fichier de configuration du projet du code (l'équivalent d'un Makefile). Pour l'essayer, téléchargez le package correspondant à votre configuration, allez dans le répertoire d'exemple contenant le code source awk et exécutez

../bin/cscout -Cc awk.cs

Vous pouvez voir certains types de constructions de préprocesseur que CScout peut gérer dans cette page . Par exemple, si vous traitez le code suivant

#define typefun(name, type, op) \
type type ## _ ## name(type a, type b) { return a op b; }

typefun(add, int, +)
typefun(sub, int, -)
typefun(mul, int, *)
typefun(div, int, /)
typefun(add, double, +)
typefun(sub, double, -)
typefun(mul, double, *)
typefun(div, double, /)

main()
{
        printf("%d\n", int_add(5, 4));
        printf("%g\n", double_mul(3.14, 2.0));
}

CScout générera un fichier de balises avec les entrées suivantes.

double_add  test.c  8       ;"  f
double_div  test.c  11      ;"  f
double_mul  test.c  10      ;"  f
double_sub  test.c  9       ;"  f
int_add test.c  4       ;"  f
int_div test.c  7       ;"  f
int_mul test.c  6       ;"  f
int_sub test.c  5       ;"  f
main    test.c  13      ;"  f
typefun test.c  1       ;"  d

Vous pouvez l'essayer vous-même en ajoutant quelques macros génératrices de code dans l'exemple de code source pour voir les balises que CScout créera.

4
Diomidis Spinellis

J'utilise le système ' global '. Après l'avoir installé, vous avez la commande "globale" pour rechercher votre code et "gtags" pour l'indexation.

Je travaille avec le noyau Linux et cela aide beaucoup: il fonctionne avec des définitions plus intelligentes (mais toujours pas aussi bonnes que je le souhaite) et il connaît le prototype de fonction, l'implémentation de la fonction et toutes les références à la fonction du code.

Il est également possible d'intégrer 'global' avec VIM, il y a n plugin pour cela :

Bonne chance.

1

Une possibilité est d'utiliser Eclim . C'est un outil puissant qui peut être utilisé de nombreuses manières; dans votre cas, vous devrez démarrer un serveur Eclipse sans tête et utiliser essentiellement l'indexeur d'Eclipse, etc. Je pense que vous devez cependant enregistrer votre projet en tant que projet Eclipse.

1
UncleZeiv