Умеренный крючок на убийстве - PullRequest
8 голосов
/ 17 сентября 2010

Я пытаюсь найти ловушку в Emacs, которая должна сработать прямо перед корректным завершением работы сервера emacs. Я пробовал kill-emacs-query-functions, 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.

1 Ответ

14 голосов
/ 17 сентября 2010

Правильное место для запуска чего-либо до выключения Emacs - либо kill-emacs-query-function, если вы хотите отменить выключение, либо kill-emacs-hook, если вы этого не сделаете.Проблема, с которой вы сталкиваетесь, заключается в том, что ваша ОС не уведомляет Emacs о корректном завершении работы таким образом, который понимает Emacs, или, если смотреть на это иначе, Emacs не понимает просьбу вашей ОС о постепенном завершении работы.1004 * Изящный способ выключения 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.

...