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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top