Utilisation simultanée de plusieurs fichiers de balises dans l’organisation vim / Tag

(Excuses pour la balise C, je l’ai fait pour la coloration syntaxique. C’est davantage une question vim. Si quelqu’un plus savant que je pense que la balise devrait être supprimée, veuillez le faire)

Dites que j’ai cette structure de répertoire:

Directory ~/Code/Test/ containing file1.c file2.c file4.c and Sub Directory ~/Code/Test/Sub/ containing file3.c 

fichier1.c:

 #include  #include "file2.c" #include "Sub/file3.c" void function1(); int main (int argc, char *argv[]) { function1(); function2(); function3(); return 0; } void function1() { printf("1\n"); } 

fichier2.c:

 #include  void function2(); void function2() { printf("2\n"); } 

Sub / file3.c:

 #include "../file4.c" void function3(); void function3() { printf("3\n"); function4(); } 

fichier4.c:

 #include  void function4(); void function4() { printf("4\n"); } 

Dans l’un de ces fichiers, il devrait être possible de passer directement à la définition des fonctions qu’il utilise à partir des autres fichiers. Ainsi, par exemple, fichier1 devrait pouvoir passer à fichier2, fichier1 devrait pouvoir passer d’un répertoire à fichier3, fichier3 devrait pouvoir passer d’un répertoire à fichier4, et voici le kicker; tous les fichiers doivent pouvoir accéder à la définition de printf. Je ne devrais pas non plus avoir à copier les balises pour l’implémentation de la bibliothèque c dans le répertoire Test afin de procéder ainsi.

Je me demande comment je pourrais y arriver. Je ne suis vraiment pas passionné par les fichiers de balises monolithiques. Avoir un fichier de tags vim-wide me fait horreur. Un fichier de balises par répertoire m’énerve. Un fichier de balises par projet est supportable. Mais ce que je voudrais vraiment, c’est un fichier de balises par fichier source, puis un moyen de spécifier les fichiers de balises auxquels vim doit faire référence.

Dans l’idéal, je voudrais pouvoir ctrl-] sur n’importe quoi et faire en sorte que vim passe à la définition correcte en fonction de ce qui est dans la scope, tout comme Visual Studio. Je commence à penser que cela ne peut pas être fait, et si c’est le cas (via une combinaison de plugins), ce serait extrêmement lent, ce qui est vraiment ennuyant parce que j’étais totalement sur le “Vim peut faire tout ce que vos nouveaux IDE peuvent faire.” “train pour deux semaines là-bas. Oui, c’est certainement l’éditeur de texte le plus puissant que j’ai rencontré, mais en tant qu’EDI, il est extrêmement non poli. Lorsque j’utilise la commande “Aller à la définition”, je m’attends à être correctement défini, qu’il s’agisse d’une variable locale, d’un fichier différent, d’une bibliothèque standard, etc. Vim m’a jusqu’ici donné des résultats hilarants, tels que sauter d’un fichier à l’autre. fichier java en fichier ac. Et vous devez utiliser une commande séparée pour accéder à la définition d’une variable locale … Quoi? (S’il y a une raison derrière cela, j’aimerais savoir)

Je suis conscient de wacking set tags=./tags dans mon fichier .vimrc et c’est ce que j’ai fait jusqu’à présent. Mais cela ne sera pas proportionnel si je travaille sur quelque chose d’énorme qui relie des assemblys séparés et des fichiers source de projets distincts.

(Pour être juste envers vim, Visual Studio ne vous permet pas de naviguer entre les assemblys pour trouver des définitions, mais il a au moins la bonne grâce de servir un fichier d’en-tête à partir duquel vous pouvez “charger un assemblage” et accéder au fichier réel. code source que vous recherchez)

Tout d’abord: Vim n’a jamais été, n’est pas et ne sera probablement jamais une alternative adéquate à un IDE. Celui qui vous a fait croire que cela devrait être abattu et que vous devriez l’être aussi parce que vous croyez un tel non-sens.

Je plaisante à moitié.

Vim est un éditeur de texte très puissant orienté programmation, mais le simple fait de devoir exécuter un indexeur de code externe stupide pour obtenir un “saut à la définition” stupide ou un autre indexeur de code pour obtenir un autre “saut à l’utilisation” stupide devrait constituer un indice. que Vim ne peut pas être comparé de manière réaliste à un IDE. Astuce: le I dans IDE signifie “Intégré” et le E signifie “Environnement”. Étant donné que vous ne pouvez pas obtenir une intégration adéquate et qu’il serait difficile de considérer Vim comme un environnement , il n’y a pas d’IDE, ici. Seul un éditeur de texte avec de nombreux plug-ins faisant différentes choses de différentes manières et, surtout, aucun moyen sérieux de comprendre votre code, caractéristique n ° 1 de l’EDI de descente.

De nombreux utilisateurs / blogueurs affirment qu’ils utilisent “Vim en tant qu’EDI” ou que vous pourriez également transformer Vim en Python ou tout autre IDE, mais la vérité est que Vim ne dispose pas de toutes les fonctionnalités de bas niveau qui permettraient de rendre une telle chose possible. Vous pouvez en faire quelque chose qui ressemble à un IDE, si vous êtes capable de croire en vos propres mensonges, mais ce ne sera probablement jamais un IDE.

Peu importe…

  • Le comportement par défaut (que vous ne pouvez pas modifier dans votre configuration) de ou :tag foo est de sauter au premier hit de vos fichiers de tags . Ni Vim ni Ctags ne connaissent la scope. Au mieux, vous pouvez être traité avec une liste à partir de laquelle choisir la balise correcte ( :ts foo ou g] ), mais c’est à quelle distance vous pouvez aller.

    Selon les langues avec lesquelles vous travaillez, Cscope peut être meilleur pour indexer votre code, mais le principe général est le même que pour Ctags. Cscope offre une fonctionnalité “de saut d’utilisation”, il peut donc être intéressant de changer pour cela.

  • S’assurer que les bons fichiers de tags sont utilisés peut être un problème et la documentation n’est étonnamment pas très utile à cet égard. EasyTags vient à l’esprit. Il existe de nombreux plugins conçus pour simplifier les choses.

    J’admets que je ne travaille pas sur de très gros projets et même pas en C, alors cela ne semblera peut-être pas utile, mais cette ligne de mon ~/.vimrc facilite le travail avec les tags :

     set tags=./tags;/,tags;/ 

    Avec ce paramètre, Vim recherche des fichiers de tags manière non-récursive (non récursive). L’important est d’avoir un seul fichier de tags à la racine de chacun de mes projets pouvant être utilisé à partir de chaque fichier de ce projet sans avoir à dire à Vim où chercher un fichier de tags .

    Une façon de gérer vos mélanges Java / C pourrait être de placer vos projets dans des répertoires spécifiques à une langue:

     C/ c.tags proj1/ tags … proj2/ tags … Java/ j.tags proj3/ tags … proj4/ tags … 

et placez-vous les fichiers de tags “globales” à la racine, ainsi que les fichiers de tags spécifiques au projet à la racine de leurs projets respectifs.

Une autre façon de traiter ce problème pourrait être de demander à Vim de charger des fichiers de tags spécifiques en fonction du type de fichier:

  autocmd FileType c setlocal tags=/path/to/your/global/c/tags,./tags;/,tags;/