2010-09-17 17 views
8

Sto cercando di trovare un hook in Emacs, che dovrebbe sparare prima dell'eliminazione regolare del server emacs. Ho cercato di query-funzioni kill-emacs-, kill-emacs-hook, server di-fatto-gancio con elisp come:Hook di emacsclient su kill

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

... ma nessuno di loro viene chiamato quando OS si spegne, così la storia è non salvato.

Forse qualcuno potrebbe dare un suggerimento?

P.S. Sono su Gentoo Linux, pacchetto emacs-vcs-23.2.9999, solo terminale. Per testare il comportamento desiderato, Emacs viene arrestato usando l'utility start-stop-daemon.

risposta

14

Il posto giusto per eseguire qualcosa prima che Emacs si chiuda sia kill-emacs-query-function se si desidera essere in grado di annullare lo spegnimento o kill-emacs-hook in caso contrario. Il problema che stai affrontando è che il tuo sistema operativo non notifica ad Emacs di spegnersi con grazia in un modo che Emacs capisce, o di guardarlo dall'altra parte, Emacs non capisce la richiesta del tuo sistema operativo di farlo giù con grazia.

Un modo elegante per arrestare Emacs 23 dall'esterno è eseguire emacsclient -n -e '(kill-emacs)'. Ovviamente non è un modo generico per dire a un programma di chiudersi con grazia.

Il modo normale di arrestare un processo con garbo su unix è inviarlo un segnale SIGHUP o SIGTERM. Sfortunatamente, Emacs considera quasi tutti i segnali fatali, e esegue solo un salvataggio automatico di emergenza e nessun codice Lisp quando li riceve. Questo non è configurabile da Lisp. A different behavior has been requested, but turned down.

Una soluzione parziale (found here) è eseguire risparmio sessione ganci delete-frame-functions. È probabile che questo hook venga eseguito prima della sequenza di spegnimento del sistema, quando si chiude l'ultimo frame o quando il server X muore (portando i terminali con sé se si esegue Emacs in un terminale). Assicurati di non eseguire il hook che uccide il server in delete-frame-functions.

A proposito, se si stava per utilizzare questo hook esatto, si noti che il codice è un modo complicato di scrivere (add-hook 'server-done-hook 'savehist-save) e che non è utile poiché c'è già savehist-autosave in kill-emacs-hook.

+0

Ho aggiunto informazioni sul SO. Sì, lo so che è un po 'complesso, quindi deve essere. – MageSlayer

+0

Se si invia ad emac un segnale QUIT, emacs può spegnersi con garbo come fa '(kill-emacs)'. per esempio. pkill -3 emacs O pkill -QUIT emacs, Sfortunatamente, alcuni SO hanno inviato il segnale TERM, emacs non funziona bene con esso. – zw963