41 votes

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

Je viens de découvrir la liste de plugin pour vim, et de lire sur la façon de l'utiliser avec ctags.

Cependant, il est décevant de constater ctags est très simple analyseur.

Est-il une alternative qui est le plus complet?

Plus précisément, je suis à la recherche de quelque chose qui:

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

  • les processus d' #include des déclarations

  • permet d'inclure des chemins d'accès pour être spécifiée pour les dépendances

Je vois que clang fournit un programatic api d'accès à la c AST, alors certes, ce n'est pas très difficile à faire?

Quelqu'un a déjà fait?

--

Edit:

Ceux-ci ne coupe pas:

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

  • clang_complete - Ne semble pas mieux que ctags. Aucun contexte des recommandations spécifiques, aucune structure d'achèvement, aucun des arguments de la fonction, pas de macro d'extension; juste une liste de symboles et le fichier qu'ils sont venus.

25voto

ldog Points 4156

J'ai passé assez de temps en difficulté avec moi-même.

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

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

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

  • clang - exige de vous passer de la gcc à un autre et "mieux" du compilateur. Le problème est gcc est beaucoup plus mature [modifier apparemment, vous n'avez pas besoin de changer de compilateurs voir les commentaires ci-dessous, je ne peut donner ce un autre essai dans l'avenir.]
  • gccsense - bonne idée (à l'aide de gcc pour vous donner le code d'achèvement) mais le travail sur le projet est abandonné :( et la version qui est en haut est la bêta de qualité
  • xref dans vim - xref est un excellent outil autonome et fonctionne très bien pour l'analyse de C. Il peut être fait de travailler dans vim avec vxref, mais à partir de mon expérience xref manque dans l'analyse actuelle du code C++ et développement s'est arrêté (ainsi que le développement sur vxref.)
  • eclim - semble fonctionner à merveille pour le support de Java à l'aide d'eclipse, extrêmement lent et complètement instable lors de l'analyse C++ ou C du code. Ce qu'il se passe est tout fonctionne pendant un long moment, mais tout à coup, l'analyseur s'arrête l'analyse de tout nouveau code que vous écrivez, et rien de moins que le chargement jusqu'à l'éclipse elle-même et de les forcer à eclipse de analyse le projet semble aider. Aussi, moins d'un fait important, mais plus d'un inconvénient est que eclim prend les erreurs de manipulation, de sorte qu'il vis la façon de vim habituellement analyse des erreurs à partir de gcc, ce qui signifie que vous n'avez pas accès au quickfix liste qui est gênant.
  • netbeans + jvi - beaucoup de gens ne jurent que par cela, mais j'ai eu toutes sortes de problèmes avec la jvi. Un problème majeur que j'ai eu était jvi dirais que je suis en mode normal, mais il était vraiment en mode insertion, rien de moins qu'un redémarrage de l'aide.
  • eclipse + viplugin/vrapper - ce qui commençait à ressembler à la meilleure option; chacun avait son propre jeu de bugs + manquait de fonctionnalités, mais était encore plus attrayant, jusqu'à ce que j'ai trouvé viable qui semblaient être les plus stables et les plus caractéristiques.

Si vous trouvez une solution, vous êtes heureux avec s'il vous plaît partager dans un commentaire, parce que je serais intéressé à elle.

7voto

Benjamin Bannier Points 11953

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

Pour la saisie semi-automatique-je utiliser clang_complete. Il ne nécessite pas de générer un index et travaille la plupart du temps assez bien. Il peut aussi faire vérification automatique de la syntaxe dans vim pour que l'on soit averti de problèmes possibles. Il n'a pas de saisie semi-automatique de la macro exemple que vous avez donné

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

en tant que bla__x si (seulement blah(x)). Ce serait bien pour que ce soit plus configurable, mais je ne considère pas cette cassés.

4voto

Diomidis Spinellis Points 8417

CScout la version 2.8 offre une option de ligne de commande (-C) qui permettra de créer un vim-compatible fichier de tags pour le code source C il va traiter. CScout est un analyseur de code source et de refactoring browser pour les collections de programmes C. Il peut traiter les espaces de travail de plusieurs projets de cartographie de la complexité introduite par le préprocesseur C de retour dans le C d'origine des fichiers de code source. Par conséquent, les étiquettes générées fichier contient des informations correctes pour les entités, comme des fonctions, des variables et des structures, qui sont créés par le biais de macros du préprocesseur. CScout aura processus d'inclure des fichiers, en utilisant le fichier à inclure les chemins spécifiés dans le code du fichier de configuration du projet (l'équivalent d'un Makefile). Pour l'essayer, téléchargez le package correspondant à votre installation, allez dans le répertoire de l'exemple contenant les awk code source et l'exécuter

../bin/cscout -Cc awk.cs

Vous pouvez voir certains types de préprocesseur constructions qui CScout pouvez 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 va générer un fichier de tags 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 essayer vous-même en ajoutant quelques générant du code des macros dans l'exemple de code source pour voir les balises CScout va créer.

1voto

UncleZeiv Points 9033

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

1voto

J'utilise"globale"du système. Après l'installation, vous devez le "global" de la commande à la recherche de votre code et de "gtags' pour l'indexation.

Je travaille avec le noyau Linux et ça aide beaucoup: il fonctionne avec les définit plus intelligent (mais toujours pas aussi bon que je le veux) et qu'il sait à propos de prototype de fonction, la fonction de mise en œuvre et toutes les références à la fonction dans le code.

Il est également possible d'intégrer des "global" avec VIM, il y a un plugin pour ça:

Bonne chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X