Правильное место для запуска чего-либо до выключения 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
.