Emacs 支持 X 会话管理协议,该协议用于挂起和重启应用程序。在 X 窗口系统中,名为 会话管理器(session manager) 的程序负责跟踪正在运行的应用。当 X 服务关闭时,会话管理器会要求应用保存状态,并在应用响应前延迟实际关闭操作。应用也可取消关闭流程。
当会话管理器重启挂起的会话时,会指示各应用分别加载保存的状态。其实现方式是通过指定特殊命令行参数,告知需要恢复的保存会话。对 Emacs 而言,该参数为 ‘--smid session’。
Emacs 通过名为 emacs-save-session-functions 的钩子支持状态保存。当会话管理器通知窗口系统即将关闭时,Emacs 会运行该钩子。
调用这些函数时不传入参数,且当前缓冲区被设为临时缓冲区。每个函数可使用 insert 向该缓冲区添加 Lisp 代码。
最后,Emacs 将缓冲区内容保存至文件,该文件称为 会话文件(session file)。
之后,当会话管理器重启 Emacs 时,会自动加载会话文件(see 加载)。该操作由启动时调用的 emacs-session-restore 函数完成。See 概述:启动时的操作序列。
若 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)