emacs --daemon

17 August 2009 #emacs#tips

Все никак не мог нормально перейти на использование 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 будет просто висеть в списке процессов. Как убедить его постоянно использовать существующий файл, без вопросов, пока не знаю…