8

私はEmacsでフックを見つけようとしています。これはemacsサーバーが正常にシャットダウンする直前に起動するはずです。私はkill-emacs-query-functions、kill-emacs-hook、server-done-hookを次のようなelispで試しました:

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

...ただし、OSのシャットダウン時に呼び出されることはないため、履歴は保存されません。

多分誰かがヒントを与えることができますか?

PS私はGentooLinux、emacs-vcs-23.2.9999パッケージ、ターミナルのみを使用しています。望ましい動作をテストするために、Emacsはstart-stop-daemonユーティリティを使用して停止されます。

4

1 に答える 1

14

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-autosavekill-emacs-hook

于 2010-09-17T19:03:17.867 に答える