2010-09-17 13 views
8

Estoy tratando de encontrar un gancho en Emacs, que debería disparar justo antes de que el servidor gracioso de emacs se apague. Probé kill-emacs-query-funciones, kill-emacs-gancho, realizado servidor-gancho con elisp como:Gancho Emacsclient en kill

(add-hook 'server-done-hook 
      '(lambda() 
      (savehist-save) 
      ) 
     ) 

... pero ninguno de ellos se llama cuando se apaga sistema operativo, por lo que la historia es No guardado.

Tal vez alguien podría dar una pista?

P.S. Estoy en Gentoo Linux, paquete emacs-vcs-23.2.9999, solo terminal. Para probar el comportamiento deseado, Emacs se detiene utilizando la utilidad start-stop-daemon.

Respuesta

14

El lugar correcto para ejecutar algo antes de que Emacs se apague es kill-emacs-query-function si desea poder cancelar el apagado o kill-emacs-hook si no lo hace. El problema al que se enfrenta es que su sistema operativo no notifica a Emacs que se apaga correctamente de forma que Emacs lo entienda, o que lo mire de otra manera, Emacs no comprende la solicitud de su sistema operativo para que se siente cómodo.

Una forma elegante de apagar Emacs 23 desde el exterior es ejecutar emacsclient -n -e '(kill-emacs)'. Obviamente, no es una forma genérica de decirle a un programa que se cierre con gracia.

La forma normal de cerrar un proceso correctamente en unix es enviarlo con la señal SIGHUP o SIGTERM. Desafortunadamente, Emacs trata a casi todas las señales como fatales, y solo ejecuta un guardado automático de emergencia y ningún código de ceceo cuando las recibe. Esto no es configurable desde lisp. A different behavior has been requested, but turned down.

Una solución parcial (found here) es ejecutar los ganchos de ahorro de sesión en delete-frame-functions. Es probable que este enlace se ejecute antes de la secuencia de apagado del sistema, ya sea cuando cierra el último cuadro o cuando el servidor X muere (tomando sus terminales con ellos si ejecuta Emacs en un terminal). Asegúrese de no ejecutar el enlace que mata al servidor en delete-frame-functions.

Por cierto, si se va a utilizar este gancho exacta, tenga en cuenta que el código es una forma complicada de escribir (add-hook 'server-done-hook 'savehist-save), y eso no es útil ya que ya hay en savehist-autosavekill-emacs-hook.

+0

Agregué información del sistema operativo. Sí, sé que es un poco complejo y necesita serlo. – MageSlayer

+0

Si enviaste a emacs una señal QUIT, emacs puede cerrar con gracia como '(kill-emacs)'. p.ej. pkill -3 emacs O pkill -QUIT emacs, Desafortunadamente, algunos sistemas operativos enviaron la señal TERM, emacs no funciona bien con ella. – zw963