Emacsclient hook on kill

8

Ich versuche einen Haken in Emacs zu finden, der direkt vor dem anmutigen Herunterfahren des Emacs-Servers ausgelöst werden sollte. Ich habe versucht, Kill-Emacs-Abfrage-Funktionen, Kill-Emacs-Hook, Server-Done-Hook mit Elisp wie:

%Vor%

... aber keiner von ihnen wird aufgerufen, wenn OS heruntergefahren wird, so dass der Verlauf nicht gespeichert wird.

Vielleicht könnte jemand einen Hinweis geben?

P.S. Ich bin auf Gentoo Linux, Emacs-VCS-23.2.9999-Paket, nur Terminal. Zum Testen des gewünschten Verhaltens wird Emacs mit dem Start-Stop-Daemon-Dienstprogramm gestoppt.

    
MageSlayer 17.09.2010, 16:34
quelle

1 Antwort

14

Der richtige Ort, um etwas auszuführen, bevor Emacs heruntergefahren wird, ist entweder kill-emacs-query-function , wenn Sie das Herunterfahren beenden möchten, oder kill-emacs-hook , wenn Sie dies nicht möchten. Das Problem, vor dem Sie stehen, besteht darin, dass Ihr Betriebssystem Emacs nicht veranlasst, ordnungsgemäß auf eine Weise herunterzufahren, die Emacs versteht, oder um es anders zu betrachten. Emacs versteht die Anforderung Ihres Betriebssystems nicht elegant.

Eine elegante Möglichkeit, Emacs 23 von außen herunterzufahren, ist emacsclient -n -e '(kill-emacs)' . Das ist offensichtlich keine generelle Art, einem Programm zu sagen, dass es elegant heruntergefahren werden soll.

Der normale Weg, um einen Prozess unter Unix ordnungsgemäß herunterzufahren, besteht darin, ein SIGHUP- oder SIGTERM-Signal zu senden. Unglücklicherweise behandelt Emacs fast alle Signale als fatal und führt nur eine automatische Notfallspeicherung und keinen Lispcode aus, wenn er sie empfängt. Dies ist nicht konfigurierbar von Lisp. Ein anderes Verhalten wurde angefordert, aber abgelehnt .

>

Eine teilweise Problemumgehung ( hier gefunden ) ist Session-Speichern-Hooks in delete-frame-functions ausführen. Dieser Hook wird wahrscheinlich vor dem Herunterfahren des Systems ausgeführt, entweder wenn Sie Ihren letzten Frame schließen oder wenn der X-Server abstürzt (indem Sie Ihre Terminals mitnehmen, wenn Sie Emacs in einem Terminal ausführen). Stellen Sie sicher, dass Sie den Hook, der den Server zum Absturz bringt, nicht in delete-frame-functions ausführen.

Übrigens, wenn Sie diesen genauen Hook verwenden würden, beachten Sie, dass Ihr Code eine komplizierte Art ist, (add-hook 'server-done-hook 'savehist-save) zu schreiben, und das ist nicht nützlich, da es bereits savehist-autosave in kill-emacs-hook gibt.

    
Gilles 17.09.2010, 19:03
quelle

Tags und Links