我试图在Emacs中找到一个钩子,这个钩子应该在emacs服务器优雅的关闭之前启动。我试过kill-emacs-query-function,kill-emacs-hook,server-done-hook与elisp如:
(add-hook 'server-done-hook
'(lambda ()
(savehist-save)
)
)
......但它们都没有在操作系统关闭时被调用,所以历史记录没有被保存。
也许有人能给个提示?
P.S. 我使用的是 Gentoo Linux,emacs-vcs-23.2.9999 包,只有终端。为了测试所需的行为,Emacs 是用 start-stop-daemon 工具停止的。
自 Emacs 24.1,Emacs运行 kill-emacs
中运行的函数。kill-emacs-hook
. 所以,这个问题和这个答案的其余部分,只与旧版本有关。
在Emacs关闭之前,正确的运行位置是 kill-emacs-query-function
如果你想取消关机或。kill-emacs-hook
如果你不这样做的话,那么你面临的问题就是你的操作系统没有以Emacs理解的方式通知Emacs优雅地关闭。你面临的问题是你的操作系统没有以Emacs理解的方式通知Emacs优雅地关闭,或者换个角度看,Emacs没有理解你的操作系统要求优雅地关闭。
从外部优雅地关闭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
.