Mag*_*yer 8 emacs kill emacsclient
我试图在Emacs中找到一个钩子,它应该在emacs服务器正常关闭之前启动.我尝试使用elisp之类的kill-emacs-query-functions,kill-emacs-hook,server-done-hook:
(add-hook 'server-done-hook
'(lambda ()
(savehist-save)
)
)
Run Code Online (Sandbox Code Playgroud)
...但是当操作系统关闭时,它们都不会被调用,因此不会保存历史记录.
也许有人可以暗示一下?
PS我在Gentoo Linux上,emacs-vcs-23.2.9999包,仅限终端.为了测试所需的行为,使用start-stop-daemon实用程序停止Emacs.
Gil*_*il' 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配置.已请求了不同的行为,但拒绝了.
部分解决方法(在此处找到)是运行会话保存挂钩delete-frame-functions.这个钩子很可能在系统关闭序列之前运行,无论是关闭最后一帧还是X服务器死机(如果在终端中运行Emacs,请将终端与它们一起使用).确保您没有运行杀死服务器的钩子delete-frame-functions.
顺便说一下,如果你打算使用这个确切的钩子,请注意你的代码是一种复杂的编写方式(add-hook 'server-done-hook 'savehist-save),而且这已经没有用savehist-autosave了kill-emacs-hook.