我正在尝试在Emacs中找到一个钩子,它应该在emacs服务器正常关闭之前触发。 我试过kill-emacs-query-functions,kill-emacs-hook,server-done-hook with elisp like:
(add-hook 'server-done-hook
'(lambda ()
(savehist-save)
)
)
...但是当OS关闭时,没有一个被调用,因此不会保存历史记录。
也许有人可以暗示一下?
P.S。我在Gentoo Linux上,emacs-vcs-23.2.9999包,仅限终端。为了测试所需的行为,使用start-stop-daemon实用程序停止Emacs。
答案 0 :(得分:14)
在Emacs关闭之前运行某些内容的正确位置是kill-emacs-query-function
,如果您希望能够取消关闭,或kill-emacs-hook
如果您不能。你面临的问题是你的操作系统没有通知Emacs以Emacs理解的方式优雅地关闭,或者以另一种方式查看它,Emacs不理解你的操作系统要求优雅地降低它的要求。
从外部关闭Emacs 23的优雅方法是运行emacsclient -n -e '(kill-emacs)'
。这显然不是告诉程序优雅关闭的通用方法。
在unix上正常关闭进程的正常方法是向其发送SIGHUP或SIGTERM信号。不幸的是,Emacs几乎将所有信号都视为致命信号,并且只接收紧急自动保存并且没有lisp代码。这不能从lisp配置。 A different behavior has been requested, but turned down
部分解决方法(found here)是在delete-frame-functions
中运行会话保存挂钩。这个钩子很可能在系统关闭序列之前运行,无论是关闭最后一帧还是X服务器死机(如果在终端中运行Emacs,请将终端与它们一起使用)。确保您没有运行在delete-frame-functions
中杀死服务器的挂钩。
顺便说一下,如果您打算使用这个确切的钩子,请注意您的代码是一种编写(add-hook 'server-done-hook 'savehist-save)
的复杂方式,这是没用的,因为savehist-autosave
中已经有kill-emacs-hook
}。