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.

33
demandé sur Canopus 2009-07-21 09:13:21

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.

26
répondu DrAl 2009-07-21 07:18:52

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.

19
répondu xolox 2014-08-04 18:57:20

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

11
répondu Dmitry Frank 2015-10-12 09:02:52

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

9
répondu Blixtor 2017-05-23 11:53:12

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()
1
répondu user15071 2010-02-20 09:45:11

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()
1
répondu Sergei Struk 2013-07-24 23:37:48

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 .

1
répondu Huy Vo 2018-04-15 10:38:49