¿Cómo eliminar la solicitud de eliminación de búferes de emacsclient?
(4)
Puede establecer el comando del teclado Cx k para que marque los búferes del cliente como terminados y elimine los búferes normales .
Me robaron descaradamente este fragmento de código de la entrada de Emacs Client en la Wiki de Emacs:
(add-hook ''server-switch-hook
(lambda ()
(when (current-local-map)
(use-local-map (copy-keymap (current-local-map))))
(when server-buffer-clients
(local-set-key (kbd "C-x k") ''server-edit))))
Si bien esto no ayuda con otras formas de eliminar los búferes (como Mx list-buffers
), debería ser seguro respetando el comportamiento del cliente de Emacs que esperan algunos scripts de shell.
Aquí hay un extracto del archivo server.el en su distribución de Emacs que podría arrojar algo de luz sobre lo que quiero decir:
;; When you finish editing a Server buffer, again call server-edit
;; to mark that buffer as done for the client and switch to the next
;; Server buffer. When all the buffers for a client have been edited
;; and exited with server-edit, the client "editor" will return
;; to the program that invoked it.
Más tarde, hay una advertencia explícita de que un búfer no se debe matar, sino que debe ser liberado (al menos así es como yo lo interpreto):
;; Ask before killing a server buffer.
;; It was suggested to release its client instead,
;; but I think that is dangerous--the client would proceed
;; using whatever is on disk in that file. -- rms.
Después de abrir algo con emacsclient, cuando elimino ese búfer (Cx k) obtengo un diálogo de confirmación:
Buffer `blah'' still has clients; kill it? (yes or no)
Pero cuando elimino búferes abiertos directamente desde Emacs, no. ¿Hay alguna forma de no obtenerlos cuando emacsclient los abrió?
La otra opción es usar la opción -n
con emacsclient
para que no espere a que el archivo se edite antes de salir.
Por ejemplo:
emacsclient -n myfile.txt
Por alguna razón, tengo que iniciar manualmente la solución remove-hook en emacs23, tal vez porque ciertas partes del servidor se cargan después de cargar .emacs. Agregar una línea ficticia (inicio de servidor) a mis .emacs antes de que (remove-hook ...) no ayudara. Así que he optado por la siguiente solución menos basada en principios:
(defalias ''server-kill-buffer-query-function ''(lambda () t))
Esto funcionó para mí:
(remove-hook ''kill-buffer-query-functions ''server-kill-buffer-query-function)
Hay más información sobre el uso de la entrada de blog Emacsclient .