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 fungsinya server-send-string
dapat digunakan untuk mengkomunikasikan perintah mengikuti server-process-filter
protokol.
Sebagai contoh:
(server-send-string (car server-buffer-clients) "-error die")
menyebabkan (salah satu) emacsclient (s) yang terkait dengan buffer untuk segera mengeluarkan teks
*ERROR*: die
dan kemudian keluar dengan kode keluar 1.
Jadi, cukup mudah untuk mendefinisikan fungsi interaktif yang bisa Anda panggil dari emacs sendiri untuk mematikan emacsclients:
(defun tell-emacsclients-for-buffer-to-die ()
"Sends error exit command to every client for the current buffer."
(interactive)
(dolist (proc server-buffer-clients)
(server-send-string proc "-error die")))
Dengan hal di atas dalam .emacs
file Anda (dan versi Emacs yang cukup saat ini), Anda dapat memohon M-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 melalui C-x #
harus mengaktifkan kesalahan yang sama keluar dari emacsclient.)
Namun, upaya saya untuk menambahkan ini ke kill-buffer-hook
gagal, karena server-kill-buffer
fungsi diletakkan di bagian depan kill-buffer-hook
daftar setelah server-visit-hook
kait telah dijalankan, dan server-kill-buffer
fungsi default akan berjalan terlebih dahulu. (Seseorang dapat memperbaiki kill-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:
(defun kill-buffer-with-special-emacsclient-handling ()
(interactive)
(add-hook 'kill-buffer-hook 'tell-emacsclients-for-buffer-to-die nil t)
(kill-buffer))
(global-set-key (kbd "C-x k") 'kill-buffer-with-special-emacsclient-handling)
Pembaruan 2: Varian yang sedikit lebih kuat:
(defun kill-buffer-with-special-emacsclient-handling ()
"Wrapper around kill-buffer that ensures tell-emacsclients-for-buffer-to-die is on the hooks"
(interactive)
(add-hook 'kill-buffer-hook 'tell-emacsclients-for-buffer-to-die nil t)
(kill-buffer))
;; (global-set-key (kbd "C-x k") 'kill-buffer)
(defun install-emacsclient-wrapped-kill-buffer ()
"Installs wrapped kill-buffer with special emacsclient handling.
Best not to install it unconditionally because the server is not
necessarily running."
(interactive)
(global-set-key (kbd "C-x k") 'kill-buffer-with-special-emacsclient-handling))
(add-hook 'server-switch-hook 'install-emacsclient-wrapped-kill-buffer)