37 votes

Comment mettre à jour automatiquement le fichier de balises dans vim?

J'utilise le fichier de balises vim C ++ pour la navigation en utilisant Ctrl-]. Le problème est à chaque fois qu'un fichier est modifié, les liens ne sont plus valides et je dois réexécuter ctags et mettre à jour le fichier de balises. Notre base de code est énorme et il faut un certain temps pour générer un fichier de balises.

Existe-t-il un outil qui met périodiquement à jour le fichier de balises en arrière-plan? Puis-je configurer VIM pour faire de même?

J'utilise gvim sous Windows.

26voto

DrAl Points 29528

Suite à Blixtor réponse, vous aurez besoin de penser un peu plus attentivement sur la conception du script. Je recommande de séparer la conception, tels que le autocommand utilise le Windows "démarrer" de commande ou similaires pour exécuter un script externe à l'arrière-plan: ainsi, la prévention de Vim de ne pas être sensible, tandis que la balise de fichier est généré.

Ce script pourrait alors générer le fichier de balises à l'aide d'un nom de fichier différent (c'est à dire pas de "tags": ctags -R -o newtags .) et, lorsque ctags est terminée, supprimez tags et renommer newtags de tags. Cela permettra d'éviter le tag d'un fichier indisponible dans Vim, tandis que la production est faite.

23voto

xolox Points 586

J'ai écrit le vim-easytags plug-in pour faire exactement cela. J'initialise mon fichier de tags une fois par la numérisation de l'ensemble du projet (à l'aide de la commande :UpdateTags **/*.[hc] par exemple) et ensuite le plug-in va automatiquement mettre à jour le fichier de tags comme je l'ai modifier et d' :update mes fichiers de code source dans Vim. Alors qu'il met à jour le fichier de tags, il bloquera Vim, mais parce qu'il ne scanne le fichier actuel, il ne prendra pas longtemps.

Mise à jour (2014-07-30): Encore à travailler sur le vim-easytags plug-in :-). Aujourd'hui, il prend en charge un mode asynchrone pour éviter le blocage de Vim. À l'heure où j'écris ceci la mode asynchrone n'est pas le mode par défaut, mais après quelques commentaires, je vais probablement passer le mode par défaut.

12voto

Dmitry Frank Points 2330

J'ai déjà écrit un plugin pour faire tout le travail dur avec ctags: Indexeur.

Il fournit indolore automatique des balises de génération pour l'ensemble du projet(s) et de la garde des balises à jour. Tags est généré dans le fond, donc, vous n'avez pas à attendre que ctags génère des balises. Vous pouvez l'utiliser de manière autonome ou comme un add-on pour un autre plugin project.tar.gz.

Dans la première méthode, vous pouvez déclarer vos projets en ~/.indexer_files comme ceci:

[CoolProject]

/home/user/cool_project

[AnotherProject]
option:ctags_params = "--languages=c++"

/home/user/another_project/src
/home/user/another_project/lib 

Et puis, lorsque vous ouvrez un fichier à partir d' /home/user/cool_project , ce projet sera indexé par les ctags. Lorsque vous ouvrez des balises à partir d'un autre projet, tags est généré pour elle aussi. Les balises de différents projets ne sont jamais mélangés. Lorsque vous enregistrez un fichier de projet, des tags est mise à jour silencieusement. Vous n'avez pas à s'en soucier, il fonctionne, tout simplement.

Il est testé avec succès sur Vim 7.3, sur les systèmes suivants:

  • Archlinux

  • Ubuntu 10.4

  • Windows XP

  • Mac OS X Lion

9voto

Blixtor Points 287

Une idée:

Utilisez Vim autocommands (:aider autocommand) pour déclencher l'exécution d'un script à chaque fois qu'un tampon est enregistré à l'aide de la BufWritePost événement.

Ce script commence le ctags génération et contient quelques autres petites logique de ne pas courir alors qu'il est déjà en cours d'exécution (ou à exécuter au plus toutes les 10 minutes, etc.).

Edit:

Quelque chose de semblable a été demandé à l'avance, voir http://stackoverflow.com/questions/155449/vim-auto-generate-ctags

1voto

user15071 Points 1628

Cette logique fonctionne dans la plupart des cas: lors de l'ouverture d'un nouveau fichier dans vim, accédez au répertoire de ce fichier et générez-y un fichier de balises s'il n'existe pas déjà. Lors de l'enregistrement d'un tampon modifié, générez un fichier de balises dans le répertoire du fichier en cours d'enregistrement:


 function! GenerateTagsFile()
  if (!filereadable("tags"))
    exec ":!start /min ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --sort=foldcase ."
  endif
endfunction

" Always change to directory of the buffer currently in focus.
autocmd! bufenter *.* :cd %:p:h
autocmd! bufread  *.* :cd %:p:h

" Generate tags on opening an existing file.
autocmd! bufreadpost *.cpp :call GenerateTagsFile()
autocmd! bufreadpost *.c   :call GenerateTagsFile()
autocmd! bufreadpost *.h   :call GenerateTagsFile()

" Generate tags on save. Note that this regenerates tags for all files in current folder.
autocmd! bufwritepost *.cpp :call GenerateTagsFile()
autocmd! bufwritepost *.c   :call GenerateTagsFile()
autocmd! bufwritepost *.h   :call GenerateTagsFile()
 

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