Умеренный крючок на убийстве
Я пытаюсь найти хук в Emacs, который должен сработать прямо перед корректным завершением работы сервера emacs. Я пробовал kill-emacs-query-functions, kill-emacs-hook, server-done-hook с помощью elisp, например:
(add-hook 'server-done-hook
'(lambda ()
(savehist-save)
)
)
... но ни один из них не вызывается, когда ОС выключается, поэтому история не сохраняется.
Может быть, кто-то может дать подсказку?
PS Я использую Gentoo Linux, пакет emacs-vcs-23.2.9999, только терминал. Для тестирования желаемого поведения Emacs останавливается с помощью утилиты start-stop-daemon.
1 ответ
Правильное место для запуска чего-либо до того, как 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
,