Một giải pháp nhanh chóng và bẩn thỉu (trong Vimscript thuần túy)
Điều này có thể bắt đầu một quá trình trong nền:
:!slow_command_here > /tmp/output 2>&1 &
Nhưng Vim cần một cách để tìm hiểu khi nào quá trình hoàn thành và làm thế nào, vì vậy hãy sử dụng tệp đánh dấu:
:!(rm -f /tmp/finished; slow_command_here > /tmp/output 2>&1; echo "$?" > /tmp/finished) &
Bây giờ chúng tôi có thể yêu cầu Vim kiểm tra thường xuyên xem liệu quy trình đã hoàn thành chưa:
: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
Này, nó không đẹp, nhưng nó là một tác phẩm!
Nhược điểm
Thật không may, autocmd ở trên sẽ không kích hoạt cho đến khi bạn di chuyển con trỏ. Và nếu bạn muốn chạy nhiều quá trình nền cùng một lúc, bạn sẽ cần thêm ID duy nhất vào các tệp đó và vào tên nhóm autocmd.
Vì vậy, nếu bạn có thể xử lý một phụ thuộc bổ sung, bạn có thể tốt hơn bằng cách sử dụng giải pháp đã thử và thử nghiệm như plugin vim-Clark được đề cập trong câu trả lời khác.
Hiển thị đầu ra
Nếu bạn muốn xem đầu ra của quá trình, thay vì chỉ mã thoát , sau đó thay thế cuối cùng echo
ở trên bằng:
silent botright pedit /tmp/output
Điều đó sẽ mở cửa sổ xem trước. Để sử dụng danh sách lỗi quickfix thay thế:
silent cget /tmp/output | copen
Danh sách quickfix cho phép bạn dễ dàng điều hướng đến các lỗi sử dụng :cnext
. Tuy nhiên, copen
di chuyển con trỏ của bạn vào cửa sổ quickfix khi nó mở ra, điều này có thể sẽ gây ngạc nhiên / khó chịu.
(Một cách giải quyết khác là sẽ mở cửa sổ QF :copen
khi bắt đầu quá trình, vì vậy bạn sẽ không cần gọi nó ở cuối.)