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.
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:
Si vous trouvez une solution qui vous convient, partagez-la dans un commentaire, car cela m'intéresserait.
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é.
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.
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.
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.