Una solución rápida y sucia (en puro Vimscript)
Esto puede iniciar un proceso en segundo plano:
:!slow_command_here > /tmp/output 2>&1 &
Pero Vim necesita una forma de averiguar cuándo se completó el proceso y cómo, así que usemos un archivo marcador:
:!(rm -f /tmp/finished; slow_command_here > /tmp/output 2>&1; echo "$?" > /tmp/finished) &
Ahora podemos pedirle a Vim que verifique cada cierto tiempo si el proceso se ha completado:
: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
Oye, no es bonito, ¡pero funciona!
Desventajas
Lamentablemente, el autocmd anterior no se activará hasta que mueva el cursor. Y si desea ejecutar más de un proceso en segundo plano a la vez, necesitará agregar ID únicos a esos archivos y al nombre del grupo autocmd.
Entonces, si puede manejar una dependencia adicional, es mejor que use una solución probada como el complemento vim-dispatch mencionado en otra respuesta.
Mostrar salida
Si desea ver el resultado del proceso, en lugar de solo el código de salida , reemplace el final echo
anterior con:
silent botright pedit /tmp/output
Eso abriría la ventana de vista previa. Para utilizar la lista de errores de corrección rápida en su lugar:
silent cget /tmp/output | copen
La lista de soluciones rápidas le permite navegar fácilmente a los errores usando :cnext
. Sin embargo, copen
mueve el cursor a la ventana de corrección rápida cuando se abre, lo que probablemente será sorprendente / molesto.
(Una solución alternativa para eso sería abrir la ventana QF :copen
al iniciar el proceso inicialmente, por lo que no necesitará llamarlo al final).