Comment exécuter «ctags -R» lors de l'enregistrement des fichiers * .h et * .cpp sans invite de confirmation?

8

Il s'agit d'une question noob, donc en gros dans vim, je veux exécuter ctags -Rlorsque j'écris dans mes fichiers source ou d'en-tête ( *.hou *.cpp), j'ai donc essayé ce qui suit:

autocmd BufWritePost *.cpp :!ctags -R
autocmd BufWritePost *.h :!ctags -R

Cela semble fonctionner, mais chaque fois que j'enregistre, il veut une confirmation, donc je dois appuyer sur Entrée, comme ceci:

"coap/coap_pdu_ll.h" 30L, 793C written
:!ctags R

Press ENTER or type command to continue

Existe-t-il un moyen de se débarrasser de la confirmation?

user1135541
la source

Réponses:

10

Lorsque vous exécutez une commande externe avec :!, Vim ne sait pas ce que la commande externe a pu écrire sur le terminal, il attend donc que vous confirmiez que vous êtes prêt à continuer.

Pour éviter cela, vous pouvez utiliser la system()fonction comme ceci:

autocmd BufWritePost *.cpp call system("ctags -R")
autocmd BufWritePost *.h   call system("ctags -R")

Vous pouvez également simplifier cela en une seule commande:

autocmd BufWritePost *.cpp,*.h call system("ctags -R")

Un problème avec l'appel system()est que vous perdez tous les messages d'erreur qu'il pourrait produire. Cela peut être résolu en utilisant echoau lieu de call, comme ceci:

autocmd BufWritePost *.cpp,*.h echo system("ctags -R")

Toutefois, cela renvoie une ligne vide à l'affichage lorsque la commande réussit, provoquant une autre invite "Appuyez sur ENTRÉE ou tapez commande pour continuer". La solution la plus simple pour cela est d'augmenter la hauteur de la ligne de commande:

:set cmdheight=2

Une autre solution, plus compliquée, serait de faire écho à un message uniquement s'il en existe un. Ensuite, vous évitez l'invite sans perdre d'espace sur l'écran.

autocmd BufWritePost *.cpp,*.h let msg=system('ctags -R') | if msg!="" | echo msg | endif
garyjohn
la source
2

Comme il semble que vous utilisez C ++, pourquoi ne pas simplement reconstruire vos balises lors de la compilation? Ajoutez simplement une règle à votre makefile.

Autres options:

Peter Rincker
la source
Vraiment de bonnes suggestions, en fait j'essaie des gutentags en ce moment. Mais, je suis surtout un minimaliste, pour moi une ligne dans un fichier .vimrc est mieux qu'un plugin, à moins que le plugin ne m'offre quelque chose qu'une ligne ne peut pas faire. Je pense que ce plugin est requis pour les bases de code plus importantes.
user1135541