Solusi cepat dan kotor (dalam Vimscript murni)
Ini dapat memulai proses di latar belakang:
:!slow_command_here > /tmp/output 2>&1 &
Tetapi Vim membutuhkan cara untuk mengetahui kapan prosesnya telah selesai, dan bagaimana, jadi mari kita gunakan file marker:
:!(rm -f /tmp/finished; slow_command_here > /tmp/output 2>&1; echo "$?" > /tmp/finished) &
Sekarang kita dapat meminta Vim untuk memeriksa sesering mungkin apakah proses telah selesai:
: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
Hei itu tidak cantik, tapi itu semacam bekerja!
Kekurangan
Sayangnya autocmd di atas tidak akan memicu sampai Anda memindahkan kursor. Dan jika Anda ingin menjalankan lebih dari satu proses latar belakang sekaligus, Anda perlu menambahkan ID unik ke file-file itu, dan ke nama grup autocmd.
Jadi, jika Anda dapat menangani ketergantungan ekstra, Anda mungkin lebih baik menggunakan solusi yang telah dicoba dan diuji seperti plugin vim-dispatch yang disebutkan dalam jawaban lain.
Menampilkan output
Jika Anda ingin melihat output dari proses, bukan hanya kode keluar , ganti final di echo
atas dengan:
silent botright pedit /tmp/output
Itu akan membuka jendela pratinjau. Untuk menggunakan daftar kesalahan perbaikan cepat sebagai gantinya:
silent cget /tmp/output | copen
Daftar perbaikan cepat memungkinkan Anda dengan mudah menavigasi ke kesalahan menggunakan :cnext
. Namun copen
memindahkan kursor Anda ke jendela perbaikan cepat ketika terbuka, yang mungkin akan mengejutkan / mengganggu.
(Solusi untuk itu adalah dengan membuka jendela QF dengan :copen
ketika awalnya memulai proses, jadi Anda tidak perlu menyebutnya di akhir.)