Emacsは、アプリケーションのサスペンドや再起動に使用されるXセッション管理プロトコルをサポートしています。X Window Systemでは、セッションマネージャと呼ばれるプログラムが、実行中のアプリケーションの管理を担っています。Xサーバがシャットダウンする際、セッションマネージャはアプリケーションに状態の保存を要求し、応答があるまで実際のシャットダウンを遅延させます。また、アプリケーション側でシャットダウンをキャンセルすることも可能です。
セッションマネージャがサスペンド中のセッションを再開する際、これらのアプリケーションに対し、保存済みの状態を個別に再読み込みするよう指示します。これは、どの保存済みセッションを復元するかを指定する特別なコマンドライン引数を用いることで行われます。Emacsの場合、この引数は ‘--smid session’ です。
Emacsは、emacs-save-session-functionsというフックを通じて状態の保存をサポートしています。セッションマネージャからウィンドウシステムが終了することを通知されると、Emacsはこのフックを実行します。各関数は引数なしで呼び出され、現在のバッファは一時バッファに設定されます。各関数はinsertを使用して、このバッファにLispコードを追加できます。最後に、Emacsはこのバッファをセッションファイルと呼ばれるファイルに保存します。
その後、セッションマネージャがEmacsを再起動すると、セッションファイルを自動的に読み込みます(読み込みを参照)。 これは、起動時に呼び出されるemacs-session-restoreという名前の関数によって行われます。 概要: 起動時の動作の流れを参照してください。
emacs-save-session-functions 内の関数が nil 以外を返すと、Emacs はセッションマネージャにシャットダウンの中止を指示します。
以下は、セッションマネージャによってEmacsが再起動された際に、*scratch*に単にテキストを挿入する例です。
(add-hook 'emacs-save-session-functions 'save-yourself-test)
(defun save-yourself-test ()
(insert
(format "%S" '(with-current-buffer "*scratch*"
(insert "I am restored"))))
nil)