Saya menemukan diri saya menggunakan sesi Emacs utama saya (CocoaEmacs di OSX) untuk mengedit baris perintah bash saya. Untuk melakukannya saya mengatur EDITOR saya ke emacsclient
. Kemudian saya mengedit baris di Emacs dan menyimpan dan keluar dari buffer itu - biasanya menggunakan "C-x #"
yang dijalankan (server-edit)
.
Masalahnya adalah kadang - kadang saya berada di tengah-tengah pengeditan baris dan saya sadar saya tidak ingin benar-benar mengeksekusi baris (penyesalan masuk). Masalahnya adalah bahwa bash menentukan apakah akan mengeksekusi baris atau tidak berdasarkan status pengembalian.
Yang saya inginkan adalah ada dua pilihan bagi saya.
Jika saya menekan
"C-x #"
simpan buffer dan kembali kode keluar0
(yaitu, saya telah melakukan pengeditan saya dan saya siap untuk bash untuk turun dengannya).Jika saya membunuh buffer maka jangan simpan buffer, bunuh, dan kembalikan kode keluar yang tidak nol. Aku bahkan tidak akan keberatan jika aku harus memukul ikatan alternatif.
Salah satu solusi parsial adalah dengan berkomentar. Saya tidak melihat ini sebagai opsi bagi saya seperti biasanya alasan saya mengedit commandline di Emacs adalah bahwa saya sedang mengerjakan hal multi-line.
sumber
Jawaban:
Dalam versi Emacs yang relatif terbaru (mis. Dalam salinan Emacs 24.2 saya, tetapi bukan distribusi OSAC dari emacs 22.1), Anda dapat menulis kode Elisp yang akan mengirim perintah ke emacsclient yang memerintahkannya untuk keluar dengan status keluar kesalahan.
Ini lebih mudah daripada kedengarannya.
Ada variabel buffer-local
server-buffer-clients
,, dengan klien yang dilampirkan ke buffer. Dan fungsinyaserver-send-string
dapat digunakan untuk mengkomunikasikan perintah mengikutiserver-process-filter
protokol.Sebagai contoh:
menyebabkan (salah satu) emacsclient (s) yang terkait dengan buffer untuk segera mengeluarkan teks
dan kemudian keluar dengan kode keluar 1.
Jadi, cukup mudah untuk mendefinisikan fungsi interaktif yang bisa Anda panggil dari emacs sendiri untuk mematikan emacsclients:
Dengan hal di atas dalam
.emacs
file Anda (dan versi Emacs yang cukup saat ini), Anda dapat memohonM-x tell-emacsclients-for-buffer-to-die
untuk membuat emacsclients keluar dengan status kesalahan. (Dan tentu saja Anda dapat mengikat fungsi ini ke urutan kunci alternatif yang sesuai.)Catatan kaki
Idealnya, seseorang kemudian akan memasangkan fungsi di atas dengan kait pada
server-kill-buffer
fungsi untuk mencapai nomor tujuan (2.) di pertanyaan awal. (Yaitu, membunuh buffer tanpa menyimpannya melaluiC-x #
harus mengaktifkan kesalahan yang sama keluar dari emacsclient.)Namun, upaya saya untuk menambahkan ini ke
kill-buffer-hook
gagal, karenaserver-kill-buffer
fungsi diletakkan di bagian depankill-buffer-hook
daftar setelahserver-visit-hook
kait telah dijalankan, danserver-kill-buffer
fungsi default akan berjalan terlebih dahulu. (Seseorang dapat memperbaikikill-buffer-hook
setelahnya, tapi saya belum yakin di mana harus meletakkan kode untuk melakukan itu ke dalam aliran kontrol Elisp.)Pembaruan: Oke, inilah cara yang sangat aneh untuk mencapai hal di atas:
Pembaruan 2: Varian yang sedikit lebih kuat:
sumber
Cukup tekan
Ctrl+C
di terminal tempat Anda menjalankan bash. Ini membatalkan edisi, dan mendorong baris asli ke sejarah. Jika Anda tidak dapat melakukan ini secara langsung karena Emacs berjalan di terminal yang sama, matikanemacsclient
proses dengan pilihan Anda.sumber
server.el