sirve - emacs tutorial
Cómo cerrar graciosamente el daemon de emacs? (9)
Creo que usar una secuencia de comandos en /etc/init.d es una solución más limpia. Consulte aquí para más detalles http://www.emacswiki.org/emacs/EmacsAsDaemon
Al iniciar sesión en Ubuntu, comienzo un daemon Emacs (versión 23) usando los programas de inicio de Ubuntu. Luego, comienzo a clientes de Emacs cada vez que necesito editar algo. Cuando cierro sesión en Ubuntu, dice que Emacs aún se está ejecutando, por supuesto. Necesito adjuntar un script en algún lugar para decirle a Gnome que apague emacs cuando cierre la sesión / cierre.
1) ¿Cómo debería ser el guión? "kill-emacs" no parece funcionar.
2) ¿Dónde debería poner este script? No hay nada en el panel de programas de inicio (Sistema-> Menú de Sesiones) que se vea útil. Preferiría algo que funcione en la cuenta del usuario, en lugar de piratear el script PostSession u otra cosa con acceso a la raíz.
Otra adición a ShreevatsaR: la secuencia de comandos python funciona como un encanto, pero sugiero usar
emacsclient -e ''(let ((last-nonmenu-event nil))(save-buffers-kill-emacs))''
como comando Al configurar last-nonmenu-event en nil forza a emacs a entrar en el modo mouse, por lo que obtienes cuadros de diálogo "agradables" en lugar de solicitudes en el minibúfer.
O incluso más elegante (en algún lugar de la configuración de emacs):
(defun shutdown-emacs-server () (interactive)
(when (not (eq window-system ''x))
(message "Initializing x windows system.")
(x-initialize-window-system)
(when (not x-display-name) (setq x-display-name (getenv "DISPLAY")))
(select-frame (make-frame-on-display display ''((window-system . x))))
)
(let ((last-nonmenu-event nil)(window-system "x"))(save-buffers-kill-emacs)))
y entonces:
emacsclient -e ''(shutdown-emacs-server)''
Quizás la solución más general sería colocar un script en el directorio PostSession del sistema que ejecuta cada script ejecutable en ~ / .logout-d, o algo similar. Luego puede colocar los scripts que desee en ~ / .logout-d, y se ejecutarán al cerrar la sesión.
El script puede ser tan simple como run-parts ~/.logout.d
.
Nota: no comprobado, aunque utilizo un script de inicio que run-parts ~/.autostart.d
, y eso ha estado funcionando bien para siempre.
Editar: Por supuesto, sería tan fácil modificar el script de python anterior para ejecutar ese mismo comando, pero personalmente no me gusta la idea de cargar un script para toda la sesión solo para ejecutar comandos al cerrar la sesión.
ShreevatsaR tiene razón, la respuesta es kill-emacs
o save-buffers-kill-emacs
, que son interactivos, por lo que pueden ejecutarse desde Emacs con Mx save-buffers-kill-emacs
. Esta es probablemente la mejor manera de hacerlo, ya que podrá guardar archivos modificados.
Otra alternativa es crear un archivo de shell como este:
#!/bin/bash
emacsclient -e "(kill-emacs)"
Que puede ejecutar desde donde quiera (icono de menú, panel, etc.).
Si usa systemd , puede estar interesado en este archivo de unidad que le permite administrar un servidor Emacs correctamente desde su consola / sistema remoto:
[Unit]
Description=Emacs: the extensible, self-documenting text editor
[Service]
Type=forking
ExecStart=/usr/bin/emacs --daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Restart=always
# Remove the limit in startup timeout, since emacs
# cloning and building all packages can take time
TimeoutStartSec=0
[Install]
WantedBy=default.target
(mata al daemon de la misma manera que la gente ya lo sugirió anteriormente).
Puede poner y nombrar el archivo de la unidad como ~ / .config / systemd / user / emacs.service para que se enlace con su usuario en lugar de ejecutarlo como root; para administrarlo:
$ systemctl --user {enable, disable, start, restart, stop} emacs.service
Tenga en cuenta: Tomé esta nota de otro lugar, no recuerdo dónde.
Solo abre algunos terminales y pkill -TERM emacs
la respuesta de willert contiene un pequeño error. debe verse como
(defun shutdown-emacs-server () (interactive)
(when (not (eq window-system ''x))
(message "Initializing x windows system.")
(x-initialize-window-system)
(when (not x-display-name) (setq x-display-name (getenv "DISPLAY")))
(select-frame (make-frame-on-display x-display-name ''((window-system . x))))
)
(let ((last-nonmenu-event nil)(window-system "x"))(save-buffers-kill-emacs)))
puede poner emacsclient -e "(kill-emacs)"
en el directorio PostSession de GDM o directamente en el script predeterminado:
/etc/gdm/PostSession/Default
ver también documentación de GDM .
Esta página de linuxquestions.org tiene una secuencia de comandos de Python que se puede ejecutar durante el inicio de sesión que escucha el evento ''guárdese usted mismo'' que Gnome emite durante el cierre. Puedes modificar eso para hacer lo de ''emacsclient -e'' (save-buffers-kill-emacs) ''''.
(Nb En realidad, no he probado el guión ...)