2010-09-17 35 views
8

我想在emacs服務器正常關機之前,應該引發Emacs鉤。 我試圖殺死-emacs的查詢的功能,殺死-emacs的鉤,服務器完成掛機用的elisp,如:Emacsclient掛在殺

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

...但他們沒有被調用時OS關閉,所以歷史沒有保存。

也許有人可以給一個提示?

P.S.我在Gentoo Linux上,emacs-vcs-23.2.9999包,終端只。爲了測試所需的行爲,使用start-stop-daemon實用程序停止Emacs。

回答

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)的方式,並且這沒有用,因爲kill-emacs-hook中已經有savehist-autosave

+0

我添加了操作系統信息。是的,我知道這需要有點複雜。 – MageSlayer 2010-09-17 19:16:06

+0

如果你發送給emacs一個QUIT信號,emacs可以像'(kill-emacs)'那樣正常關閉。例如pkill -3 emacs或pkill -QUIT emacs,不幸的是,有些操作系統發送了TERM信號,emacs不能正常工作。 – zw963 2016-03-28 06:36:31

相關問題