# Еmacs как демон
Andrew Lobanov(tavern,1) — All
2020-08-05 07:32:59


Давно знал о сабжевой возможности, но никогда не пользовался. А тут попробовал в очередной раз и мне очень понравилось.

Дело в том, что у меня значительно разбух .emacs и время запуска, соответственно, стало неудобоваримым. Всё это усугубляется тем, что порой я запускаю несколько экземляров (например, как редактор в цезии) и длительный запуск утомляет.

Суть проста: экземпляр emacs запускается в режиме демона без пользовательского интерфейса. Последний запускается в виде клиента и потому стартует очень быстро.

Запустить emacs в качестве демона очень просто:

$ emacs --daemon

Для запуска клиента с графическим фреймом и всеми возможностями графической версии достаточно просто выполнить

$ emacsclient -c

Если же хочется запустить клиент в терминале, то

$ emacsclient -nw

Вот и всё. Но есть ещё тонкости некоторых настроек, которые перестают работать в режиме демона и клиента. У меня проявились две: не подхватился шрифт и не выключался scrollbar.

Обе проблемы решились весьма просто.

(setq default-frame-alist '((font . "Iosevka-12")))

И проблема с шрифтом решена.

Scrollbar же я убрал не так красиво, но вполне действенно. В ~/.Xdefaults добавил строчку

emacs.verticalScrollBars: false

Теперь в фреймах отсутствует scrollbar.

Возможность эта достаточно известна, но вдруг кому-нибудь покажется полезным иметь emacs всегда запущенным, а пользовательский интерфейс вызывать по необходимости.

Что удобно, открытые буферы и их состояние, запущенные elisp-программы не зависят от клиента и выполняются демоном. Можно хранить состояние между вызовами интерфейса. Можно открыть несколько фреймов emacs и работать в них одновременно, если по какой-либо причине неудобно использовать окна emacs в одном фрейме. И самое главное -- молниеносный запуск клиента. Теперь писать в секту сторонним редактором стало очень удобно и быстро.

# Re: Еmacs как демон
Difrex(dynamic,1) — Andrew Lobanov
2020-08-05 11:56:37


> Давно знал о сабжевой возможности, но никогда не пользовался.
Я наоборот всегда пользовался. Особенно удобно стало, когда стали официальный юнит поставлять. Смог свой выкинуть.
# запускаем emacs в демоне при старте сессии
systemctl --user enable --now emacs

# мои алиасы
alias | grep emacs
ec='emacsclient -c'
eeval='/home/difrex/.oh-my-zsh/plugins/emacs/emacsclient.sh --eval'
eframe='emacsclient --alternate-editor "" --create-frame'
emacs='/home/difrex/.oh-my-zsh/plugins/emacs/emacsclient.sh --no-wait'
eshell='emacsclient -nw -c -e "(eshell '\''N)"'
te='/home/difrex/.oh-my-zsh/plugins/emacs/emacsclient.sh -nw'

# Re: Еmacs как демон
Andrew Lobanov(tavern,1) — Difrex
2020-08-05 13:23:48


>> Давно знал о сабжевой возможности, но никогда не пользовался.
Difrex> Я наоборот всегда пользовался. Особенно удобно стало, когда стали официальный юнит поставлять. Смог свой выкинуть.

У меня тут другая проблема проявила себя, но пока не выявил откуда ноги растут. Один раз перестала работать подсветка синтаксиса при редактировании текста. То есть если файл открыть, то всё подсвечено. Начинаешь редачить - подсветки нет и вообще как будто режим не работает. Отступы тоже не расставляются. Сохраняешь файл, открываешь - снова всё подсвечено.

Перезапустил демон - починилось.

Если был схожий опыт, то буду рад помощи. Вдруг ещё проявится.

PS: есть подозрение, что в закрывающем теге в org-mode опечатка привела к таким последствиям, но воспроизвести не смог.

# Re: Еmacs как демон
Difrex(dynamic,1) — Andrew Lobanov
2020-08-05 17:10:31


Не, у меня с демоном проблем никогда не было. Обычно проблемы в конфиге. Помогает запуск с --debug-init без демона.

# Re: Еmacs как демон
vit01(mira, 1) — Andrew Lobanov
2020-08-25 06:13:43


У меня немного другой сетап емакса

В конфиге стоит вот это

(require 'server)
(unless (server-running-p)
  (server-start))

Сам редактор запускаю с помощью скрипта-обёртки. Если емакс уже запущен, то скрипт дёргает emacsclient, а если не запущен, то запускает его

#!/bin/bash

if [ "`pgrep emacs`" = "" ]; then
        emacs $@ & exit
else
        emacsclient --no-wait $@
fi

Это решение, скорее всего, недостаточно гибкое, но проблему долгого первого запуска тоже решает идеально.

+++ Отправлено через IDEC Mobile
+++ GNU/Linux, Android, physics, MLP:FIM

# Re: Еmacs как демон
Peter(syscall,1) — vit01
2020-08-25 12:34:47


> В конфиге стоит вот это

А я как дурак c-x 5 2...

Надо сделать так же, удобно!

# Re: Еmacs как демон
btimofeev(tavern,13) — vit01
2020-08-31 21:25:47


vit01> ====
vit01> (require 'server)
vit01> (unless (server-running-p)
vit01> (server-start))
vit01> ====

Вместо этого можно грузить через systemd при логине пользователя (в этом случае даже самый первый запуск редактора будет быстрый):

Добавляем файл ~/.config/systemd/user/emacs.service:

[Unit]
Description=Emacs Daemon

[Service]
Type=forking
ExecStart=/usr/bin/emacs --daemon
ExecStop=/usr/bin/emacsclient --eval "(progn (setq kill-emacs-hook 'nil) (kill-emacs))"
Restart=always

[Install]
WantedBy=default.target

Активируем сервис командой systemctl --user enable emacs.service и перелогиниваемся.

vit01> Сам редактор запускаю с помощью скрипта-обёртки. Если емакс уже запущен, то скрипт дёргает emacsclient, а если не запущен, то запускает его

vit01> ====
vit01> #!/bin/bash

vit01> if [ "`pgrep emacs`" = "" ]; then
vit01> emacs $@ & exit
vit01> else
vit01> emacsclient --no-wait $@
vit01> fi
vit01> ====

А этот скрипт можно заменить одной строкой:

emacsclient -c -a emacs

# Re: Еmacs как демон
Difrex(dynamic,1) — btimofeev
2020-09-01 14:38:55


> Добавляем файл ~/.config/systemd/user/emacs.service
Больше не нужно. Начиная с 26 версии юнит идет вместе с дистрибутивом

systemctl --user cat emacs.service
# /usr/lib/systemd/user/emacs.service
[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=notify
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
# The location of the SSH auth socket varies by distribution, and some
# set it from PAM, so don't override by default.
# Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

> Активируем сервис командой systemctl --user enable emacs.service и перелогиниваемся.
Не нужно перелогиниваться. Просто systemctl --user enable --now emacs, либо systemctl --user start emacs

# Re: Еmacs как демон
vit01(mira, 1) — btimofeev
2020-09-01 14:50:55


btimofeev> Вместо этого можно грузить через systemd при логине пользователя (в этом случае даже самый первый запуск редактора будет быстрый):

Это интересно, но в моей конфигурации настраивать будет проблематично. Поясняю почему:

Есть 2 линукса и 1 макось, конфиг емакса (и директория emacs.d) лежит в Nextcloud и автоматом синхронизируется между компами. В нужные места на ФС проставлены симлинки. Пусть на линухе и systemd, но на яблоке придётся сооружать свой отдельный костыль, а мне проще держать одинаковый конфиг сразу на всех системах, чтобы избегать нагромождений настроек

btimofeev> А этот скрипт можно заменить одной строкой:
btimofeev> emacsclient -c -a emacs

Всегда было интересно, а как сделать так, чтобы когда через гуй открываешь файл, то он запускался именно через emacsclient, а не просто через emacs. Когда-то я крутил desktop файлы, откуда пункты контекстного меню подцеплялись, но уже давно подзабыл, как это делается.

+++ IDEC Mobile в виртуальной машине
+++ GNU/Linux, Android, physics, MLP:FIM

# Re: Еmacs как демон
btimofeev(tavern,13) — vit01
2020-09-01 16:04:34


vit01> Всегда было интересно, а как сделать так, чтобы когда через гуй открываешь файл, то он запускался именно через emacsclient, а не просто через emacs. Когда-то я крутил desktop файлы, откуда пункты контекстного меню подцеплялись, но уже давно подзабыл, как это делается.

Думаю можно просто в desktop файле емакса исправить команду.

# Re: Еmacs как демон
btimofeev(tavern,13) — Difrex
2020-09-01 16:07:56


>> Добавляем файл ~/.config/systemd/user/emacs.service
Difrex> Больше не нужно. Начиная с 26 версии юнит идет вместе с дистрибутивом

Этого не знал, спасибо. Тогда удалю.