54 votes

Vim générer automatiquement des balises

Droit maintenant, j'ai la suite dans ma .vimrc:

au BufWritePost *.c,*.cpp,*.h !ctags -R

Il y a quelques problèmes:

  1. C'est lent -- régénère les tags pour les fichiers qui n'ont pas changé depuis la dernière balise de la génération.
  2. Je dois pousser le bouton enter de nouveau après l'écriture du fichier en raison de l'inévitable "appuyez sur Entrée ou de type de commande à continuer".

Lorsque vous combinez ces deux questions, je finis par pousser supplémentaire entrer trop tôt (avant ctags -R a fini), puis voir l'ennuyeux message d'erreur, et avez qu'à appuyer sur entrée à nouveau.

Je sais que ce ne pas sembler une grosse affaire, mais avec la quantité de fichier écrit-je faire sur un jour donné, il tend à devenir vraiment ennuyeux. Il doit bien y avoir une meilleure façon de le faire!

43voto

Zathrus Points 5385

au BufWritePost *.c,*.cpp,*.h silent! !ctags -R &

L'inconvénient est que vous n'aurez pas utile balises du fichier jusqu'à la fin. Aussi longtemps que vous êtes sur un *nix système, il devrait être ok pour faire de multiples écrit avant que la précédente ctags terminé, mais vous devez le tester. Sur un système Windows de ne pas mettre en arrière-plan et il va se plaindre que le fichier est verrouillé jusqu'à ce que le premier ctags finitions (ce qui ne devrait pas causer des problèmes dans vim, mais vous vous retrouverez avec un peu obsolète fichier de tags).

Remarque, vous pouvez utiliser l' --append option tonylo suggère, mais alors vous devrez peut-être désactiver tagbsearch ce qui pourrait signifier que la balise de recherches prendra beaucoup plus de temps, selon la taille de votre fichier de balises.

14voto

Aristotle Pagaltzis Points 43253

Edit: Une solution très bien le long des lignes de ce qui suit a été posté sous le Bouton script vim. Notez que le script a besoin d'un vim avec le support de Python, cependant.

Ma solution shells pour awk au lieu de cela, donc, il faut travailler sur de nombreux autres systèmes.


au FileType {c,cpp} au BufWritePost <buffer> silent ! [ -e tags ] &&
    \ ( awk -F'\t' '$2\!="%:gs/'/'\''/"{print}' tags ; ctags -f- '%:gs/'/'\''/' )
    \ | sort -t$'\t' -k1,1 -o tags.new && mv tags.new tags

Notez que vous ne pouvez l'écrire de cette façon dans un script, sinon il a qu'à aller sur une seule ligne.

Il y a beaucoup de choses là-bas:

  1. Cette auto-commande déclenche lorsqu'un fichier a été détecté comme C ou C++, et ajoute à son tour un tampon local auto-commande est déclenchée par l' BufWritePost événement.

  2. Il utilise l' % de l'espace réservé qui est remplacé par le tampon du nom de fichier au moment de l'exécution, en collaboration avec l' :gs modificateur utilisé pour le shell-citer le nom de fichier (en tournant intégré unique-devis en devis-escape-citation-citation).

  3. De cette façon, il exécute une commande shell qui vérifie si un tags le fichier existe, auquel cas son contenu est imprimé, sauf pour les lignes qui font référence à la juste fichier de sauvegarde, en attendant ctags est appelée sur le tout nouveau fichier enregistré, et le résultat est alors sorted et de les remettre en place.

Mise en garde réalisateur: cela suppose que tout est dans le même répertoire, et que c'est aussi la mémoire tampon locale répertoire courant. Je n'ai pas donné toute la pensée de chemin de déformation.

11voto

xolox Points 586

J'ai écrit à easytags.vim pour faire ceci: mettre à jour et mettre en évidence automatiquement les balises. Le plug-in peut être configuré pour ne mettre à jour que le fichier en cours d'édition ou tous les fichiers du répertoire du fichier en cours d'édition (de manière récursive). Il peut utiliser un fichier de balises globales, des fichiers de balises spécifiques au type de fichier et des fichiers de balises spécifiques au projet.

7voto

code933k Points 71

J'ai toutefois remarqué qu'il s'agit d'un vieux fil de discussion ... Utilisez incron dans * nix, comme les environnements prenant en charge inotify. Il lancera toujours des commandes chaque fois que les fichiers d'un répertoire changent. c'est à dire,

 /home/me/Code/c/that_program IN_DELETE,IN_CLOSE_WRITE ctags --sort=yes *.c
 

C'est tout.

3voto

tonylo Points 2058

Peut-être utiliser l'argument append aux ctags comme démontré par:

http://vim.wikia.com/wiki/Autocmd_to_update_ctags_file

Je ne peux pas vraiment en témoigner, car j'utilise généralement l'insight sur les sources pour parcourir le code, mais j'utilise vim en tant qu'éditeur ... allez comprendre.

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