Katakanlah saya memiliki server X11 yang menggantung, membuat saya tidak menyimpan pekerjaan dari sesi XTerm Vim yang dikendalikan server X11. (Bukan GVim, hanya Vim-in-XTerm biasa.)
Apakah ada cara yang saya bisa (dari terminal yang berbeda) memberitahu proses Vim yang sedang berjalan untuk "menyimpan semua & keluar" dari baris perintah? Dengan mengirimkan sinyal, atau melalui cara lain?
Saya tahu tentang file swap Vim, dan saya hanya bisa membunuh Vim dan pulih dari swap. Saya bertanya apakah ada cara "bersih".
Jawaban:
Baru-baru ini mengalami masalah ini (melalui cara lain: Vim berjalan pada server jauh, dan saya lupa layar), saya memutuskan untuk mencari cara.
Gagasan pertama adalah mencari deskriptor file yang digunakan oleh Vim dan mencoba menulisnya. Fds Vim menunjuk ke psedoterminal yang dibuka oleh terminal emulator, cukup alami:
Namun, beberapa upaya awal saya gagal:
Itu
^[
dan^M
diperoleh oleh CtrlVEscdan CtrlVEnter, masing-masing.Mereka semua menghasilkan karakter yang muncul di terminal (saya menguji ini secara lokal, sebelum menerapkannya pada sesi jarak jauh). Googling sekitar, saya menemukan posting SO ini , menggunakan Python untuk menulis ke perangkat pseudoterminal:
Dan mencobanya pada shell python interaktif berhasil:
Selesai!
sumber
Anda dapat mengirim perintah ke vim secara eksternal jika Anda menjalankan ...
Server Vim
Misalnya, melakukan:
akan menyebabkan vim meluncurkan server dengan nama "vim". Sebut dua kali dan server baru akan disebut "vim1", sebut saja tiga kali dan itu akan menjadi "vim2", dll. Anda mungkin ingin membuat alias dari perintah itu.
Anda bisa tahu server apa yang dinamai instance tertentu dengan melihat judul jendela. Ketika kamu melihat:
nama server bersifat case-insensitive "VIM3" ("vim3" akan merujuk pada contoh yang sama.). Perhatikan bahwa jika Anda melihat:
itu tidak selalu berarti bahwa itu punya server bernama "VIM". Anda dapat memastikan server ada dengan mendaftarkan nama server dengan:
Namun, pertanyaannya hanya muncul untuk "VIM", khususnya. Jika Anda melihat "GVIM" atau nama lain dengan nomor yang ditambahkan, maka itu berarti server.
Bagaimana cara menggunakan klien
Sekarang, ke pertanyaan Anda, Anda dapat menyimpan semua dan keluar dari contoh vim tertentu dengan melakukan, misalnya:
Kami menggunakan pelarian untuk kembali ke mode normal jika Anda berada dalam mode insert atau command. Anda dapat melakukan sesuatu selain dari itu
:wqa
, tetapi itu tampaknya yang paling tepat bagi saya karena itu akan meninggalkan swapfiles buffer yang tidak dapat diselamatkan (karena mereka baru dan tidak memiliki nama file, dll.).Jika Anda ingin melakukannya untuk semua contoh seperti dalam kasus Anda di sini, Anda bisa mengulang daftar server seperti:
Jika karena alasan tertentu Anda tidak suka
--remote-send
, Anda dapat menggunakan--remote-expr
yang memiliki kelebihan yang akan menyebabkan klien untuk menampilkan hasil atau kesalahan yang mungkin disebabkan, seperti:Perhatikan bahwa menggunakan fungsionalitas server Vim mengharuskan Vim dibangun dengan
+clientserver
opsi.sumber
Instal
reptyr
perintah menggunakan manajer paket sistem, seperti:Kemudian gunakan
reptyr
perintah untuk mengalihkan tty jarak jauh ke tty lokal (baru), sebagai berikut:Di mana
PID
ID proses darips
output perintah.Setelah kesalahan:
Ubah "ruang lingkup ptrace" ke 0:
Setelah sesi vim telah ditukar dari sesi lama ke yang baru, simpan dan keluar seperti biasa. Perhatikan bahwa Anda mungkin harus menekan Enteruntuk menyegarkan konsol.
sumber
Bagaimana jika Anda dengan anggun membunuh Vim?
kill -s 15 -p [PID for Vim]
kill -s (signal) 15 disebut SIGTERM yang memberitahukan proses itu untuk mematikan dirinya dengan anggun.
Untuk mendapatkan PID (ID Proses) Vim, gunakan:
ps ax | grep vim
sumber