Une solution rapide et sale (dans Vimscript pur)
Cela peut démarrer un processus en arrière-plan:
:!slow_command_here > /tmp/output 2>&1 &
Mais Vim a besoin d'un moyen de savoir quand le processus est terminé et comment utiliser un fichier marqueur:
:!(rm -f /tmp/finished; slow_command_here > /tmp/output 2>&1; echo "$?" > /tmp/finished) &
Maintenant, nous pouvons demander à Vim de vérifier de temps en temps si le processus est terminé:
:augroup WaitForCompletion
:autocmd!
:autocmd CursorHold * if filereadable('/tmp/finished') | exec "augroup WaitForCompletion" | exec "au!" | exec "augroup END" | echo "Process completed with exit code ".readfile('/tmp/finished')[0] | end
:augroup END
Hé, ce n'est pas joli, mais ça marche en quelque sorte!
Désavantages
Malheureusement, la commande autocmd ci-dessus ne se déclenchera que lorsque vous aurez déplacé le curseur. Et si vous souhaitez exécuter plusieurs processus d'arrière-plan à la fois, vous devez ajouter des ID uniques à ces fichiers et au nom du groupe autocmd.
Donc, si vous pouvez gérer une dépendance supplémentaire, vous feriez peut-être mieux d'utiliser une solution éprouvée telle que le plugin vim-dispatch mentionné dans une autre réponse.
Affichage de la sortie
Si vous voulez voir la sortie du processus, plutôt que juste le code de sortie , remplacez le final echo
ci-dessus par:
silent botright pedit /tmp/output
Cela ouvrirait la fenêtre de prévisualisation. Pour utiliser la liste d'erreurs de correction rapide à la place:
silent cget /tmp/output | copen
La liste des solutions rapides vous permet de naviguer facilement en utilisant les erreurs :cnext
. Cependant, copen
déplace votre curseur dans la fenêtre de correction rapide lors de son ouverture, ce qui sera probablement surprenant / ennuyeux.
(Pour contourner ce problème, ouvrez la fenêtre QF :copen
lors du démarrage initial du processus. Vous n'aurez donc pas besoin de l'appeler à la fin.)