首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacsclient钩子杀死

Emacsclient钩子杀死
EN

Stack Overflow用户
提问于 2010-09-18 00:34:42
回答 1查看 2.1K关注 0票数 8

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

代码语言:javascript
复制
(add-hook 'server-done-hook
          '(lambda ()
             (savehist-save)
             )
          )

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

也许有人能给点提示?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3737207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档