Emacclient在杀戮时的钩子

问题描述 投票:8回答:1

我试图在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 kill emacsclient
1个回答
14
投票

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-autosavekill-emacs-hook.

© www.soinside.com 2019 - 2024. All rights reserved.