emacs --daemon
Все никак не мог нормально перейти на использование Emacs в режиме демона, по той простой причине, что не мог определиться, как его корректно запускать и как его корректно закрывать…
Для начала немного теории… Emacs запускается в режиме демона командой:
$ emacs --daemon
После чего для того, чтобы открыть новый фрейм Emacs, в котором можно работать используется команда:
$ emacsclient -c
или для консоли:
$ emacsclient -t
Запускать демон предлагается при загрузке иксов, но существует проблема, которая заключается в том, что если демон по каким либо причинам не был запущен, то вызов emacsclient ни к чему не приведет. Для решения данной проблемы уже неоднократно предлагалось создать отдельный скрипт со следующим содержимым:
#!/bin/bash
emacs --daemon && emacsclient -c
И заетм запускать клиентом с дополнительной опцией:
$emacsclient -c -a script.sh
Вроде бы ничего, но дополнительные костыли?? Так вот, как оказалось, все намного проще… Достаточно запускать клиент с такими опциями:
$ emacsclient -c -a ""
И никакого скрипта не нужно. Демон самостоятельно запуститься, если он не работал до того, отслеживать уже не нужно.
Теперь разберемся за корректным завершением. Для этого в конфиге .emacs прописываем следующую функцию и навешиваем ее на клавиатурную комбинацию:
;; Kill-server
(defun my-kill-emacs ()
(interactive)
(save-some-buffers)
(desktop-save-in-desktop-dir)
(kill-emacs))
(global-set-key (kbd "C-x c") 'my-kill-emacs)
Как видно, используется сочетание клавиш Ctrl-x c. Перед тем, как завершить работу, нужно будет подтвердить свое действие.
Осталось решить проблему с тем, что демон не запускается в том случае, если в предыдущем сеансе работа была завершена некорректно. Если быть точным, при запуске в консоли будет произведен запрос на перезапись существующего desktop файла. А вот при запуске по горячим клавишам в DE мы этого не увидим и emacs будет просто висеть в списке процессов. Как убедить его постоянно использовать существующий файл, без вопросов, пока не знаю…