Jika saya melakukan ini dari shell:
$ sleep 100
Saya bisa membuatnya ke latar belakang dengan melakukan:
^Z
$ bg
Dan kemudian terus menggunakan shell saya. Anda bisa mendapatkan efek yang sama dengan menambahkan a &
ke akhir perintah, tetapi saya sering lupa ini.
Di Vim, saya sering melakukan:
:!sleep 100
Dan di sini juga, saya sering lupa menambahkan &
. Bisakah saya meletakkan proses ini di latar belakang dan terus menggunakan Vim seperti di shell?
external-command
unix
Martin Tournoij
sumber
sumber
&
setiap waktu::nnoremap :! :!&<Left>
... Tapi tentu saja, kadang-kadang Anda tidak menginginkannya&
, dan harus menekan <Del> untuk menghapusnya.Jawaban:
Seperti yang
<C-z>
akan menangguhkan Vim sendiri, bukan hanya perintah shell yang diluncurkan, itu tidak akan berfungsi.Apa yang akan saya lakukan adalah membatalkan perintah yang sudah berjalan lama
<C-c>
, kemudian meluncurkan kembali perintah yang sama di latar belakang via(
:!!
Perintah ini berguna untuk memanggil kembali perintah eksternal sebelumnya di sini; Anda juga dapat menggunakan riwayat perintah Ex melalui<Up>
.)sumber
Anda bisa meletakkan perintah di skrip shell yang melatar belakanginya sendiri. Konten, misalnya, mungkin:
sumber
tmux
secara default, tetapi masalahnya adalah bahwa sesi Vim saya (dengan file terbuka dan semacamnya) masih tidak berguna. Saya bisa beralih ke panel lain, dan menjalankan skrip saya di sana, tetapi itu lebih banyak tindakan daripada:!gitk %
misalnya ... Masalahnya dengan menggunakan skrip adalah bahwa saya harus membuat banyak skrip ini untuk setiap perintah yang mungkin. Mungkin itu bukan ide yang buruk untuk beberapa perintah yang paling sering digunakan (sepertigitk
&mupdf
).Biasanya ketika suatu proses dimulai, Anda tidak memiliki banyak kendali selain menghentikannya ( Ctrl+ c) atau menangguhkannya ( Ctrl+ z, tetapi termasuk proses induknya).
Namun tergantung pada jenis proses dan sistem operasi, berikut adalah beberapa trik yang dapat Anda coba:
Mengirim
SIGTSTP
atauSIGSTOP
akan menghentikan proses (sinyal yang sama dikirim oleh Ctrl+ z), danSIGCONT
akan melanjutkan (melanjutkan) proses. Pengujian dengansleep
tidak berfungsi, jadi Anda harus mengujinya dengan perangkat lunak tertentu bagaimana menangani sinyal. MisalnyaMengirim
SIGHUP
ke proses. Secara default sinyal ini menghentikan proses, namun jika proses mengimplementasikan sinyal SIGHUP, ia harus melepaskan diri dari mengendalikan tty dan menjalankan kembali di latar belakang dengan id proses baru (biasanya digunakan dengan daemon). Sayangnya banyak aplikasi tidak menanganinya dengan benar dan mati begitu saja (termasuksleep
). MisalnyaSolusi lain dapat menggunakan alat-alat seperti
retty
(pasang kembali ke pseudo-tty),detach
(melepaskan proses dari terminal),nohup
( memutus proses dari terminal ) ataugdb
(melampirkan ke proses yang ada-p
dan menutup file deskriptornya seperti tty, contoh serupa) ).Untuk info lebih lanjut, periksa: Kontrol pekerjaan (Unix) - Implementasi di Wikipedia.
Lihat juga:
man kill
atauman sigaction
.sumber
Catatan : Jawaban ini sepertinya hanya berfungsi dengan
tcsh
danfish
shells. Saya juga mencobabash
,dash
,mksh
, danzsh
, dan itu tidak bekerja di sana; Saya tidak yakin mengapa, karena jika saya melakukan tindakan yang sama dari kerang ini tanpa Vim, itu tidak bekerja seperti yang diharapkan ... (:!
perintah dijalankan meskipun shell).Saya kebetulan menggunakan
tcsh
, jadi itu berfungsi untuk saya ...Anda dapat menggunakan
:set shell=/bin/tcsh
untuk mengatur shell Anda; ini bersifat global. Jadi gunakan saja jika menurut Anda ini fitur yang sangat penting :-)^Z
mengirimSIGTSTP
sinyal, Anda dapat mengirim sinyal inikill
, dan kemudian gunakanSIGCONT
untuk melanjutkan (melanjutkan) proses. Ini akan melepaskan proses dari Vim.Karena sulit untuk ditunjukkan dengan ini
sleep
(bagaimana Anda tahu bahwa ia telah melanjutkan eksekusi?), Saya akan gunakangitk
sebagai contoh (tetapi program GUI akan melakukannya):Misalnya di Vim:
Dan kemudian di terminal lain:
Anda tentu saja dapat juga menggunakan
killall
, ataupkill
; sebagai contoh:Anda perlu membuka terminal lain untuk ini, yang tidak ideal, tetapi itu akan memungkinkan Anda untuk terus menggunakan Vim dan proses eksternal Anda.
sumber