Una soluzione rapida e sporca (in puro Vimscript)
Questo può avviare un processo in background:
:!slow_command_here > /tmp/output 2>&1 &
Ma Vim ha bisogno di un modo per scoprire quando il processo è stato completato e come, quindi usiamo un file marker:
:!(rm -f /tmp/finished; slow_command_here > /tmp/output 2>&1; echo "$?" > /tmp/finished) &
Ora possiamo chiedere a Vim di controllare ogni tanto se il processo è stato completato:
: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
Ehi, non è carino, ma in un certo senso funziona!
svantaggi
Sfortunatamente l'autocmd sopra non si attiverà finché non si sposta il cursore. E se si desidera eseguire più di un processo in background alla volta, è necessario aggiungere ID univoci a tali file e al nome del gruppo autocmd.
Quindi, se riesci a gestire una dipendenza aggiuntiva, potresti stare meglio usando una soluzione collaudata come il plugin vim-dispatch menzionato in un'altra risposta.
Visualizzazione dell'output
Se vuoi vedere l' output del processo, piuttosto che solo il codice di uscita , sostituisci il echo
precedente sopra con:
silent botright pedit /tmp/output
Ciò aprirebbe la finestra di anteprima. Per utilizzare invece l'elenco degli errori di correzione rapida:
silent cget /tmp/output | copen
L'elenco delle correzioni rapide ti consente di navigare facilmente verso gli errori utilizzando :cnext
. Tuttavia, copen
quando si apre, sposta il cursore nella finestra della correzione rapida, il che probabilmente sarà sorprendente / fastidioso.
(Una soluzione per questo potrebbe essere quella di aprire la finestra QF con :copen
quando inizialmente iniziare il processo, quindi sarà non necessario chiamare alla fine.)