Умеренный крючок на убийстве

Я пытаюсь найти хук в 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,

Другие вопросы по тегам