Emacsclient挂钩杀死

时间:2010-09-17 16:34:42

标签: emacs kill emacsclient

我正在尝试在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。

1 个答案:

答案 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 }。

相关问题