Emacs 24.1以降kill-emacs
、 の関数を実行するEmacs が実行されkill-emacs-hook
ます。したがって、質問とこの回答の残りの部分は、古いバージョンにのみ関連しています。
Emacs がシャットダウンする前に何かを実行する適切な場所はkill-emacs-query-function
、シャットダウンをキャンセルできるようにしたい場合、またはkill-emacs-hook
そうでない場合です。あなたが直面している問題は、OS が、Emacs が理解できる方法で正常にシャットダウンするように Emacs に通知しないか、逆に言えば、Emacs が OS の正常にシャットダウンする要求を理解していないことです。
外部から Emacs 23 をシャットダウンする適切な方法は、 を実行することemacsclient -n -e '(kill-emacs)'
です。これは明らかに、プログラムを正常にシャットダウンするように指示する一般的な方法ではありません。
UNIX でプロセスを適切にシャットダウンする通常の方法は、プロセスに SIGHUP または SIGTERM シグナルを送ることです。残念ながら、Emacs はほとんどすべてのシグナルを致命的なものとして扱い、それらを受信したときに緊急自動保存のみを実行し、Lisp コードは実行しません。これは Lisp からは設定できません。別の動作が要求されましたが、却下されました。
部分的な回避策 (ここにあります) は、セッション保存フックを実行することdelete-frame-functions
です。このフックは、最後のフレームを閉じたとき、または X サーバーが停止したとき (端末で Emacs を実行している場合は、端末を一緒に使用するとき) に、システムのシャットダウン シーケンスの前に実行される可能性があります。でサーバーを強制終了するフックを実行しないようにしてくださいdelete-frame-functions
。
ところで、この正確なフックを使用する場合、コードは複雑な書き方であることに注意して(add-hook 'server-done-hook 'savehist-save)
ください。savehist-autosave
kill-emacs-hook