Eine schnelle und schmutzige Lösung (in reinem Vimscript)
Dies kann einen Prozess im Hintergrund starten:
:!slow_command_here > /tmp/output 2>&1 &
Vim muss jedoch einen Weg finden, um herauszufinden, wann und wie der Prozess abgeschlossen ist. Verwenden wir also eine Markierungsdatei:
:!(rm -f /tmp/finished; slow_command_here > /tmp/output 2>&1; echo "$?" > /tmp/finished) &
Jetzt können wir Vim bitten, von Zeit zu Zeit zu überprüfen, ob der Vorgang abgeschlossen ist:
: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
Hey, es ist nicht schön, aber es funktioniert irgendwie!
Nachteile
Leider wird die obige automatische Bestätigung erst ausgelöst, wenn Sie den Cursor bewegen. Und wenn Sie mehr als einen Hintergrundprozess gleichzeitig ausführen möchten, müssen Sie diesen Dateien und dem Namen der autocmd-Gruppe eindeutige IDs hinzufügen.
Wenn Sie also mit einer zusätzlichen Abhängigkeit fertig werden, ist es möglicherweise besser, eine bewährte Lösung wie das in einer anderen Antwort erwähnte vim-dispatch-Plugin zu verwenden.
Ausgabe anzeigen
Wenn Sie die Ausgabe des Prozesses und nicht nur den Exit-Code sehen möchten , ersetzen Sie das echo
obige Finale durch:
silent botright pedit /tmp/output
Das würde das Vorschaufenster öffnen. So verwenden Sie stattdessen die Quickfix-Fehlerliste:
silent cget /tmp/output | copen
Mit der Quickfix-Liste können Sie leicht zu Fehlern navigieren, indem Sie verwenden :cnext
. copen
Bewegt jedoch den Cursor in das Quickfix-Fenster, wenn es geöffnet wird, was wahrscheinlich überraschend / ärgerlich sein wird.
(Eine Problemumgehung dafür wäre das Öffnen des QF-Fensters :copen
beim ersten Starten des Prozesses, sodass Sie es am Ende nicht aufrufen müssen.)