gancio emacsclient su uccisione
-
03-10-2019 - |
Domanda
Sto cercando di trovare un gancio in Emacs, che dovrebbe sparare a destra prima di emacs server di arresto regolare. Ho provato kill-emacs-query-funzioni, Kill-emacs-gancio, server di-fatto-gancio con elisp come:
(add-hook 'server-done-hook
'(lambda ()
(savehist-save)
)
)
... ma nessuno di loro viene chiamato quando chiude OS verso il basso, così la storia non viene salvato.
Forse qualcuno potrebbe dare un suggerimento?
P.S. Sono su Gentoo Linux, emacs-VCS-23.2.9999 pacchetto, solo terminale. Per testare il comportamento desiderato Emacs viene interrotto utilizzando un'utilità start-stop-daemon.
Soluzione
Il posto giusto per eseguire qualcosa prima di Emacs chiude verso il basso è o kill-emacs-query-function
se si vuole essere in grado di annullare l'arresto o kill-emacs-hook
se non lo fai. Il problema si sta affrontando è che il sistema operativo non notifica Emacs di chiudere con grazia in un modo che Emacs capisce, o di vedere le cose da un'altra parte, Emacs non capisce la richiesta del vostro sistema operativo per suht con grazia.
Un modo aggraziato di spegnere Emacs 23 dall'esterno è quello di eseguire emacsclient -n -e '(kill-emacs)'
. Questo non è ovviamente un modo generico di raccontare un programma di chiudere con grazia.
Il modo normale di arrestare un processo grazia sul unix è quello di inviare un segnale SIGHUP o SIGTERM. Purtroppo, Emacs tratta quasi tutti i segnali come fatale, e solo gestisce un auto di emergenza di salvataggio e nessun codice Lisp quando li riceve. Questo non è configurabile da Lisp. Un comportamento diverso è stato richiesto, ma rifiutato .
Una soluzione parziale ( trovato qui ) è quello di eseguire sessione ganci risparmio in delete-frame-functions
. Questo gancio è probabilmente da eseguire prima della sequenza di spegnimento del sistema, sia quando si chiude il ultimo fotogramma o quando le matrici del server X (assunzione delle terminali con loro se si esegue Emacs in un terminale). Assicurarsi di non eseguire il gancio che uccide il server in delete-frame-functions
.
A proposito, se si stavano per utilizzare questo gancio esatto, nota che il codice è un modo complicato di scrivere (add-hook 'server-done-hook 'savehist-save)
, e che non è utile dal momento che c'è già savehist-autosave
in kill-emacs-hook
.