Comment mettre à jour automatiquement le fichier tag dans vim?
j'utilise le fichier vim c++ tag pour la navigation en utilisant Ctrl-]. Le problème est que chaque fois qu'un fichier est modifié, les liens ne sont plus valides et je dois relancer ctags et mettre à jour le fichier de balise. Notre base de code est énorme et cela prend beaucoup de temps pour générer des fichiers d'étiquettes.
y a-t-il un outil qui actualise périodiquement le fichier de balise en arrière-plan? Puis-je configurer VIM pour faire la même chose?
j'utilise gvim sous Windows.
7 réponses
suite à la réponse de Blixtor, vous aurez besoin de réfléchir un peu attentivement sur la conception du script. Je recommande de séparer le design de manière à ce que l'autocommand utilise la commande "start" de Windows ou similaire pour exécuter un script externe en arrière-plan : empêchant ainsi Vim d'être inactive pendant que le fichier tag est généré.
que le script pourrait alors générer le fichier de balise en utilisant un nom de fichier différent (i.e. pas " tags": ctags -R -o newtags .
) et, lorsque la ctags est complète, supprimer tags
et renommer newtags
en tags
. Ceci empêchera le fichier d'étiquette d'être indisponible dans Vim pendant que la génération est faite.
j'ai écrit le vim-easytags plug-in pour faire exactement cela. J'initialise mon fichier tags une fois en scannant un projet entier (en utilisant la commande :UpdateTags **/*.[hc]
par exemple) et ensuite le plug-in mettra automatiquement à jour le fichier tags pendant que je édite et :update
mes fichiers de code source dans Vim. Pendant qu'il met à jour le fichier tags, il bloque Vim, mais parce qu'il scanne seulement le fichier courant, il ne prend pas longtemps.
mise à jour (2014-07-30): travaille toujours sur le plug-in vim-easytags :-). De nos jours, il supporte un mode asynchrone pour éviter de bloquer 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.
j'ai déjà écrit un plugin pour faire tout le travail difficile avec des ctags: indexeur .
il fournit la génération d'étiquettes automatiques sans douleur pour le(s) projet (s) entier (s) et tient les étiquettes à jour. Tags est généré en arrière-plan , donc, vous n'avez pas à attendre que ctags génère des tags. Vous pouvez l'utiliser indépendamment ou comme un add-on pour un autre plugin projet.tar.gz .
dans le premier façon, vous pouvez déclarer vos projets dans ~/.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 de /home/user/cool_project
, tout ce projet sera indexé par ctags. Quand vous ouvrez des tags d'un autre projet, des tags sont générés pour cela aussi. Les balises de différents projets ne sont jamais mélangés. Lorsque vous sauvegardez le fichier du projet, tags est mis à jour en silence. Vous n'avez pas à s'en soucier, il fonctionne, tout simplement.
pour plus d'informations, voir l'article: Vim: navigation de code commode pour vos projets , qui explique l'utilisation de Indexer + Vimprj soigneusement.
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
Une idée:
utilisez vim autocommands (: help autocommand) pour déclencher l'exécution d'un script chaque fois qu'un buffer est sauvegardé en utilisant L'événement BufWritePost.
ce script démarre la génération de ctags et contient une petite logique supplémentaire pour ne pas tourner pendant qu'il est déjà en cours d'exécution (ou pour courir au plus toutes les 10 minutes, etc.).
Edit:
quelque chose de similaire a été demandé ici à l'avance, voir Vim génération automatique de ctags
cette logique fonctionne dans la plupart des cas: lors de l'ouverture d'un nouveau fichier dans vim, changez le répertoire de ce fichier et générez un fichier tags s'il n'existe pas déjà. Lors de l'enregistrement d'un tampon modifié, générer un fichier tags 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()
http://vim.wikia.com/wiki/Autocmd_to_update_ctags_file
function! DelTagOfFile(file)
let fullpath = a:file
let cwd = getcwd()
let tagfilename = cwd . "/tags"
let f = substitute(fullpath, cwd . "/", "", "")
let f = escape(f, './')
let cmd = 'sed -i "/' . f . '/d" "' . tagfilename . '"'
let resp = system(cmd)
endfunction
function! UpdateTags()
let f = expand("%:p")
let cwd = getcwd()
let tagfilename = cwd . "/tags"
let cmd = 'ctags -a -f ' . tagfilename . ' --c++-kinds=+p --fields=+iaS --extra=+q ' . '"' . f . '"'
call DelTagOfFile(f)
let resp = system(cmd)
endfunction
autocmd BufWritePost *.cpp,*.h,*.c call UpdateTags()
de son dépôt: vim-gutentags
est un plugin qui s'occupe de la gestion très nécessaire des fichiers tags dans Vim. Il va (re) générer des fichiers d'étiquettes que vous travaillez tout en restant complètement hors de votre chemin. Il fera même de son mieux pour garder ces fichiers d'étiquettes hors de votre chemin aussi. Il n'a pas de dépendances et fonctionne simplement.
vous pouvez essayer à https://github.com/ludovicchabant/vim-gutentags .