我正在尝试在Emacs中找到一个钩子,它应该在emacs服务器正常关闭之前触发。我用elisp尝试了kill-emacs-query-function、kill-emacs-hook、server-done hook,如下所示:
(add-hook 'server-done-hook
'(lambda ()
(savehist-save)
)
)..。但是当操作系统关闭时,它们都不会被调用,因此不会保存历史记录。
也许有人能给点提示?
附注:我在Gentoo Linux上,emacs-vcs-23.2.9999软件包,仅限终端。为了测试所需的行为,使用start-stop-daemon实用程序停止Emacs。
发布于 2010-09-18 03:03:18
由于Emacs 24.1,Emacs运行kill-emacs,后者运行kill-emacs-hook中的函数。所以这个问题,以及这个答案的其余部分,只与旧版本相关。
在Emacs关闭之前,正确的运行位置要么是kill-emacs-query-function,如果你想取消关机,要么是kill-emacs-hook。你面临的问题是,你的操作系统没有通知Emacs以Emacs理解的方式优雅地关闭,或者从另一个角度来看,Emacs不理解你的操作系统优雅地关闭的请求。
从外部关闭Emacs23的一种优雅方法是运行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)的方式,这没有什么用处,因为kill-emacs-hook中已经有了savehist-autosave。
https://stackoverflow.com/questions/3737207
复制相似问题