Obtenir le code d'erreur linux make dans vim
-
28-09-2019 - |
Question
Je suis en train d'obtenir le code de retour « 0 de succès, en cas d'erreur non nul » de faire dans vim. Plus précisément, je suis sur Ubuntu et l'utilisation v:shell_error
ne fonctionne pas.
Après avoir creusé autour et regarder cette question, il semble être à cause de mon cadre shellpipe, qui est
shellpipe=2>&1| tee
Les tuyaux de la marque tee
sortie de nouveau dans vim. La coque est apparemment en le code d'erreur du tee au vim et non de faire. Comment puis-je obtenir le code d'erreur de faire à la place?
La solution
Vous pouvez essayer de faire une fonction personnalisée pour cela. Par exemple. en utilisant la sortie de make redirigeant run :call system("make > make.out")
dans un fichier. Après cette charge le fichier d'erreur en utilisant :cf make.out
. Jamais essayé moi-même, cependant.
En fin de compte, les résultats de make
pourraient aussi être simplement vérifié en testant si le résultat est là, dans le système de fichiers:
:make | if !filereadable("whatever-make-was-supposed-to-create") | throw "Make failed!!!" | endif
(ici le « | ». Symbole est le séparateur de commandes de vim). Attribution qui à un raccourci clavier supprimerait la nécessité de taper
P.S. J'essaie souvent de faire mes programmes pour produire aucun avertissement, donc je jamais vraiment tombé sur la question. Quel BTW conduit à une autre solution possible: il suffit de retirer les avertissements (ou simplement des lignes de sortie indésirables) en utilisant par exemple grep -v tabooword
de la sortie de marque en remplaçant la 'makeprg'
. Ce qui est effectivement décrit dans l'aide. :h 'makeprg'
P.P.S. Je suis mis à la VIM ... Pourvu que vous utilisez également bash comme shell. Est-ce que vous avez essayé d'ajouter à la sortie {$ de PIPESTATUS [0]} au shellpipe? .: par exemple
:set shellpipe=2>&1\ \|\ tee\ %s;exit\ \${PIPESTATUS[0]}
Juste testé que sur Debian et cela a fonctionné pour moi. :h 'shellpipe'
plus.
Autres conseils
La seule chose que je peux penser actuellement est de créer deux scripts wrapper pour faire et tee. Je suis sûr qu'il ya un moyen plus facile, mais vous pourriez maintenant essayer ceci:
Créer un script d'emballage make:
#!/bin/bash
make $@
echo $? > ~/exit_code_cache
Créer un script d'emballage de départ:
#!/bin/bash
tee $@
return `cat ~/exit_code_cache` # (or do something else with the exit code)
Utilisez la nouvelle marque :set makeprg=mymake
et configurer votre propre shellpipe
qui utilise votre wrapper (tee shellpipe=2>&1 | mytee
).
Il est pas testé, mais l'idée doit être claire. Espérons que cela aide.