Supprimer la sortie d'une autocomande vim

13

J'ai une autocommande définie dans mon vimrc:

au BufWritePost * !./make.sh

Le script make.shcompile un .texfichier 3 fois et je ne veux pas que la sortie soit affichée.

Existe-t-il un moyen de supprimer la sortie?

J'ai essayé d'ajouter silentune ligne avant la aucommande, mais cela n'a pas fonctionné. J'ai également essayé de cette façon sans succès.

Andre Herman Bezerra
la source

Réponses:

20

Le silence devrait aller avant !./make.sh, pas avant au. Mettre silentavant ausignifie simplement qu'il enregistrera la commande automatique en silence. Cela devrait plutôt ressembler à ceci:

au BufWritePost * silent! !./make.sh

Un problème avec l'exécution d'une commande externe comme celle-ci avec la :silentcommande est que l'écran ne se redessine pas, vous laissant un écran vide. Cependant, vim a une commande qui redessine l'écran, qui peut être utilisée comme ceci:

au BufWritePost * silent! execute "!./make.sh >/dev/null 2>&1" | redraw!

La raison pour laquelle j'ai besoin d'utiliser la commande d'exécution est parce que la :!commande utilise tous les caractères trouvés après elle, ce qui signifie que je ne pouvais pas le faire silent! !./make.sh | redraw!car bash essaierait d'interpréter tous les caractères après !.

Remarques

Notez que :silent!ignore les messages d'erreur, alors :silentque non. De plus, la >/dev/null 2>&1partie redirige toutes les sorties de !./make.shvers /dev/null. Vous pouvez en savoir plus sur la redirection d'E / S dans bash ici .

Rubriques d'aide pertinentes

  • :help :execute
  • :help :silent
  • :help :!
  • :help :bar
Arbre à feuilles persistantes
la source
La deuxième commande a fonctionné, bien qu'elle imprime toujours la sortie à l'écran. De plus, je n'ai plus besoin d'appuyer sur Entrée lorsque le script se termine, ce qui est bien. Mais je me demande s'il existe un moyen de supprimer totalement la sortie.
Andre Herman Bezerra
1
Est-ce que le remplacement execute "!./make.sh"par de l' execute "!./make.sh >/dev/null 2>&1"aide? Cela redirige toutes les sorties de la commande vers /dev/null. Lisez tldp.org/LDP/abs/html/io-redirection.html pour plus d'informations sur la redirection dans bash.
EvergreenTree
J'aurais dû penser à cela! Ça marche. Merci!
Andre Herman Bezerra
7

La réponse à votre question directe est exactement comme @EvergreenTree a posté. Cependant, j'ai l'impression que vous manquez un outil intégré de Vim pour la construction / compilation / linting de projets. Plus particulièrement :makeet la liste des correctifs.

Qu'est-ce que l'utilisation :makenous apporte?

L'utilisation vous :makepermet de rassembler vos erreurs dans une liste connue sous le nom de liste de correctifs. En utilisant le quickfix, vous pouvez naviguer entre les erreurs dans vos fichiers, donc vous sautez directement à l'endroit où le compilateur dit que l'erreur est (pratique, non?).

:faire

L' exécution :makeexécutera le programme make, 'makeprg'. Ensuite, analysez la sortie avec 'errorformat'et mettez chaque entrée dans la liste des correctifs.

Par 'makeprg'défaut, la makecommande qui exécute a Makefile. Cependant, vous pouvez modifier votre 'makeprg'via la :compilercommande ou le définir directement.

Vous pouvez également transmettre des arguments supplémentaires à :make. par exemple:make clean

Remarque: l'exécution :makeaffichera souvent la sortie de la commande en bas de l'écran avec une invite demandant d'appuyer sur entrée. Appuyez simplement sur Entrée car toutes les sorties seront disponibles dans la liste des correctifs. Vous pouvez supprimer cela via :silent, par exemple :silent make.

Une commande personnalisée courante pour une marque silencieuse est:

command -nargs=* -bar Smake silent make <args> <bar> cwindow

liste quickfix

Après avoir exécuté :makevotre liste de correctifs, la sortie du compilateur sera conservée.

Utilisez la commande suivante pour parcourir la liste des correctifs.

  • :copen ouvrir la fenêtre quickfix
  • :cclose fermer la fenêtre quickfix
  • :cnext/ :cprevpour passer à l'élément suivant / précédent
  • :ccpour imprimer en bas l'erreur actuelle ou :cc 3pour afficher une erreur spécifique dans cet exemple 3

Personnellement , je l' utilise de Tim Pope intact plug - in pour naviguer dans la liste des quickfix.

Qu'en est-il de l'exécution :makeautomatique et silencieuse?

Vous pouvez le faire avec un :autocmdcomme vous où.

augroup auto_make
    autocmd!
    autocmd BufWritePost * silent make
    autocmd QuickFixCmdPost *make* cwindow
augroup END

En bonus, j'ai ajouté en ouvrant la fenêtre de correction rapide via :cwindows'il y a des erreurs.

Remarque: devrait être plus spécifique avec ce modèle de fichier sur l' BufWritePostautocmd afin que les fichiers non liés ne soient pas créés.

Il y en a encore plus?!

Cela utilise seulement quelques commandes intégrées de Vim plus quelques autocmd pour convaincre. Il existe bien sûr des plugins et des outils qui pourraient vous aider

  • Dispatch.vim peut être utilisé pour exécuter des :maketâches de manière asynchrone.
  • Syntastic plugin syntax checks file after :write.
  • Ale.vim (Asynchronous Lint Engine) est un plugin pour fournir des peluches dans NeoVim et Vim 8 pendant que vous éditez vos fichiers texte.
  • Unimpaired.vim facilite la gestion de la liste des correctifs rapides.
  • Vieux Makefiles simples. À moins que ce ne ./script.shsoit très compliqué, vous pouvez envisager d'utiliser make. Il peut évoluer pour effectuer plus de tâches plus tard et est un outil de construction courant.
  • Vous pouvez utiliser Vim Awesome pour rechercher d'autres plugins qui pourraient vous aider.

Conclusion

Personnellement, :makej'intègre et le quickfix dans mon propre workflow. Je crois que la capture de la sortie de votre processus de construction et la capture des erreurs valent bien l'investissement. En prime, vous deviendrez peut-être plus à l'aise avec la liste des correctifs et pourrez utiliser la liste pour d'autres applications comme :grep.

Pour plus d'aide, voir:

:h :make
:h quickfix
:h 'makeprg'
:h 'errorformat'
:h :compiler
:h :copen
:h :cwindow
:h :cnext
:h :cc
Peter Rincker
la source
J'y ai pensé :makependant que je répondais à cela, mais je ne l'ai pas inclus. C'est une meilleure idée d'utiliser make avant de compiler les choses.
EvergreenTree
comment modifier l'autocmd pour exécuter uniquement makeprg sur un certain fichier.
Ibn Saeed