8

我试图在 Emacs 中找到一个钩子,它应该在 Emacs 服务器正常关闭之前触发。我尝试了使用 elisp 的 kill-emacs-query-functions、kill-emacs-hook、server-done-hook,例如:

(add-hook 'server-done-hook
          '(lambda ()
             (savehist-save)
             )
          )

...但是当操作系统关闭时,它们都不会被调用,因此不会保存历史记录。

也许有人可以给出提示?

PS 我在 Gentoo Linux 上,emacs-vcs-23.2.9999 包,仅限终端。为了测试所需的行为,Emacs 使用 start-stop-daemon 实用程序停止。

4

1 回答 1

14

Emacs 24.1开始,Emacs 运行kill-emacskill-emacs-hook. 所以这个问题,以及这个答案的其余部分,只与旧版本有关。

在 Emacs 关闭之前运行某些东西的正确位置是,kill-emacs-query-function如果您希望能够取消关闭,或者kill-emacs-hook您不希望取消关闭。您面临的问题是您的操作系统没有通知 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.

于 2010-09-17T19:03:17.867 回答