LINUX.ORG.RU

Правильный запуск emacs в качестве сервера в иксах и в консоли

 ,


1

4

Задача состоит в том, чтобы правильно запускать emacs в качестве сервера на разных системах (с иксами и без) с одним и тем же конфигом.

На данный момент в этом общем для двух машин конфиге есть следующее:

(server-start)

(if (display-graphic-p)
    (load-theme 'my_theme_for_x11 t)
  (ding)
  (load-theme 'my_theme_for_console))

При запуске команд:

emacs --daemon
emacsclient -c
а так же при команде
emacsclient -c -a ''
в любом случае запускается тема «my_theme_for_console».

Про функцию display-graphic-p сказано, что:

This function returns t if display is a graphic display
capable of displaying several frames and several different
fonts at once. This is true for displays that use a window
system such as X, and false for text terminals. 

И поэтому ожидалось, что в иксах будет запущена тема «my_theme_for_x11».

Вопрос: где ошибка в конфиге?

Deleted

Последнее исправление: Deleted (всего исправлений: 1)

Сделай системдовый юнит и запускай через него.

[Unit]
Description=Emacs: the extensible, self-documenting text editor

[Service]
#User=%i
#Group=users
Type=forking
ExecStart=/usr/bin/emacs --eval '(progn (setq server-name "dev") (server-start))' --daemon 
ExecStop=/usr/bin/emacsclient -s dev --eval "(progn (setq kill-emacs-hook 'nil) (kill-emacs))"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=always
#WorkingDirectory=%h

# Remove the limit in startup timeout, since emacs
# cloning and building all packages can take time
TimeoutStartSec=0

[Install]
WantedBy=default.target
Hertz ★★★★★
()
Последнее исправление: Hertz (всего исправлений: 1)

А ты уверен что

(if (display-graphic-p)
    (load-theme 'my_theme_for_x11 t)
  (ding)
  (load-theme 'my_theme_for_console))

выполняется при запуске каждого клиента, а не только при первом запуске сервера?

Deleted
()
Ответ на: комментарий от Deleted

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

Допустим, это не проверяется, но тогда почему всё равно запускается консольная тема?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

только при первом запуске сервера

Всё так. У меня тоже в конфиге есть кое где такой баг, который пока обходится перезагрузкой одного из елисповых конфигов. Пока не разбирался, как решить по умному.

Hertz ★★★★★
()
Ответ на: комментарий от Hertz

Сделай системдовый юнит и запускай через него.

а что — не умеет чтоль emacs заменять собой systemd ?

anonymous
()

(if (display-graphic-p) (load-theme 'my_theme_for_x11 t) (load-theme 'my_theme_for_console))

Решительно непонятно, зачем вы себя ограничиваете в возможности подключиться к единожды запущенному «из Иксов» Емаксу «из консоли».

У ГНУ Емакса темы давно уже применяются *условно* для каждого фрэйма.

Zmicier ★★★★★
()

Про функцию display-graphic-p сказано, что:
This function returns t if display is a graphic display

Все так.

И поэтому ожидалось, что в иксах будет запущена тема «my_theme_for_x11».

Напрасно.

Вопрос: где ошибка в конфиге?

Ошибка в ожиданиях. Демон — он на то и демон, что он *безголовый*. Нет никакого экрана вообще, ни графического, ни иного.

Zmicier ★★★★★
()
Ответ на: комментарий от Hertz

Сделай системдовый юнит и запускай через него.

Нафига?

Или вы Файрфокс тоже через Систем-Д запускаете?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Ошибка в ожиданиях. ... Нет никакого экрана вообще, ни графического, ни иного.

Тема 'my_theme_for_console' - она такая же графическая тема, как и 'my_theme_for_x11', просто по цветам лучше подходит для консольного режима. Почему emacsclient запускает именно её? Запускал бы тогда дефолтную тему (т.е. ни ту, ни другую).

Нет никакого экрана вообще, ни графического, ни иного

А как emacsclient может сделать вывод о том, какую тему ему применять?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от Zmicier

Задача состоит в том, чтобы правильно запускать emacs в качестве сервера на разных системах (с иксами и без) с одним и тем же конфигом.

У ГНУ Емакса темы давно уже применяются *условно* для каждого фрэйма.

Говоря иначе: если ваша любимая тема неправильно выглядит «без Иксов» (будь это потому, что слишком малая цветность или еще почему), то это баг темы. Пишите рапорт.

Zmicier ★★★★★
()
Ответ на: комментарий от anonymous

Слушай, ему бы самого себя заменить. Всё параллелизм туда запихать не могут, одни треды пихают, другие за futures топят.

Hertz ★★★★★
()
Ответ на: комментарий от Deleted

(if (display-graphic-p) (load-theme 'my_theme_for_x11 t) (load-theme 'my_theme_for_console))

Почему emacsclient запускает именно её? Запускал бы тогда дефолтную тему (т.е. ни ту, ни другую).

Иначе говоря, вы спрашиваете, почему Емакс не мыслит в троичной логике?

Не надо понимать «made with secret alien technology» слишком буквально. :-D

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Hertz

Всё параллелизм туда запихать не могут

Запихнули уже десять реализаций. Толку-то, тонны кода на elisp'е это не перепишет.

aedeph_ ★★
()
Ответ на: комментарий от Hertz

А удобно.

Ну а Файрфокс-то тоже?

Хм... Может быть, мне тоже стоит попробовать?

Демон — системдёй, emacsclient — в консоли или мышкой в меню.

Не понял, как это связано.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Говоря иначе: если ваша любимая тема неправильно выглядит «без Иксов» (будь это потому, что слишком малая цветность или еще почему), то это баг темы.

допустим, в качестве «my_theme_for_x11» я взял дефолтную белую тему, но фон выставил серый. Теперь он серый и в терминале. Поэтому для голой консоли я хочу выставить другую тему, или хотя бы другой фон.

Есть ли в настройках темы такая опция, чтобы в случае консольного запуска фон той же темы был другим?

Deleted
()
Ответ на: комментарий от Zmicier

Иначе говоря, вы спрашиваете, почему Емакс не мыслит в троичной логике? По крайней мере, вот такой вариант вполне работает в случае запуска не в серверном режиме.

(if (display-graphic-p) 
    (enable-theme 'solarized) 
  (enable-theme 'wheatgrass))

Кстати, а зачем лично Вам серверный режим? Я вижу пару вариантов использования: на случай перезапуска иксов, на случай, когда mutt использует emacsclient, чтобы отвечать на письма. Ещё?

Deleted
()
Ответ на: комментарий от Zmicier

Ну а Файрфокс-то тоже?

Он не демонизируется. А Emacs можно запускать раздельно сервер-клиент.

Не понял, как это связано.

Прямо связано. При запуске системы запускается демон emacs. А потом в любой момент по клику мгновенно стартует клиент и цепляеся к emacs-server. Клиентов можно запускать много вешая на один сервер. Для меня такой подход оказался намного удобнее, чем каждый раз с нуля подгружать все конфиги. И не боишься, что закрыв окно всё навернётся. Навернётся, если systemctl --user restart emacs выполнишь.

Hertz ★★★★★
()

Твой код, как тебе уже сказали отрабатывает только внутри безголового демона на старте. Вот так будет работать при каждом создании фрейма:

(defun my-set-theme (_frame)
  "Set frame theme"
  (if (display-graphic-p)
      (load-theme 'my_theme_for_x11 t)
    (ding)
    (load-theme 'my_theme_for_console)))

(add-to-list 'after-make-frame-functions 'my-set-theme)

feofan ★★★★★
()
Ответ на: комментарий от Deleted

допустим, в качестве «my_theme_for_x11» я взял дефолтную белую тему,

Я вас сейчас дико удивлю, но она *не белая*. Она универсальная. Откройте фрэйм на черном фоне — и увидите, что все цвета *другие*.

То есть надо, наверное, думать, что есть какой-то механизм. :-)

но фон выставил серый. Теперь он серый и в терминале.

Это плохо?

Поэтому для голой консоли я хочу выставить другую тему, или хотя бы другой фон.

Ну вот это и надо было спрашивать!

Есть ли в настройках темы такая опция, чтобы в случае консольного запуска фон той же темы был другим?

Конечно, и это тоже есть. Хотя в данном случае вы, уверен, хотите не этого.

(custom-theme-set-faces
 'user
 '(default
    ((((class color) (min-colors 88) (type graphic))
      :background "gray")
     (((class color) (min-colors 88) (type tty))
      :background "blue"))))

Zmicier ★★★★★
()
Ответ на: комментарий от feofan

Опаньки!.. Земляк, стопарик за твоё здоровье! Спасибо!

Hertz ★★★★★
()

Кстати, emacs с версии толи 26, толи 27 поддерживает trueColor для терминала. Терминал, правда, тоже должен его уметь. Но, например, xfce4-term умеет. Тема в консоли выглядит точно также, как в иксах.

feofan ★★★★★
()
Ответ на: комментарий от Hertz

Он не демонизируется.

Так для Систем-Д и не нужно, даже только мешает.

При запуске системы запускается демон emacs.

Вот. Зачем? Чем плох обычный запуск при первом запуске клиента?

Клиентов можно запускать много вешая на один сервер. Для меня такой подход оказался намного удобнее, чем каждый раз с нуля подгружать все конфиги. И не боишься, что закрыв окно всё навернётся.

Да это ежу понятно. Понятно, что никто не будет запускать каждую рамку в изолированном процессе.

(К слову, даже если Иксы навернуться, все должно выжить, если только Систем-Д тут ничего не сломал.)

Навернётся, если systemctl --user restart emacs выполнишь.

Да, зачем его засовывать под Систем-Д? Что это дает?

Но я, кажется, уже уловил, что ничего не дает. :-) Не буду вас больше доставать, извините.

Zmicier ★★★★★
()
Ответ на: комментарий от feofan

Что-то ты делаешь не так.

Возможно, делаю не так, как у тебя. А делаю я вот как. Беру пустой конфиг, ставлю туда этот код с названиями своих тем, проверяю, не запущен ли emacs (он не запущен), и проверяю конфиг:

emacs --daemon
emacsclient -c
Deleted
()
Ответ на: комментарий от Deleted

Запускай через

--debug-init
Если это тебе ничего не скажет, скинь выхлоп сюда.

Если ничего не выдаст - сделай

M-x toggle-debug-on-error [RET] C-x 5 2

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 2)
Ответ на: комментарий от Zmicier

Чем плох обычный запуск при первом запуске клиента?

Не разбирался. Раньше запускал Emacs целиком, увидел где-то на реддите пост про запуск его из под системди, попробовал да так и оставил.

Hertz ★★★★★
()
Ответ на: комментарий от Deleted

(if (display-graphic-p) (load-theme 'my_theme_for_x11 t) (load-theme 'my_theme_for_console))

Почему emacsclient запускает именно её? Запускал бы тогда дефолтную тему (т.е. ни ту, ни другую).

Иначе говоря, вы спрашиваете, почему Емакс не мыслит в троичной логике?

По крайней мере, вот такой вариант вполне работает в случае запуска не в серверном режиме.

Как работает? Выполняет не «если», и не «иначе», а что-то третье? :-)

Если Емакс запущен не демоном, то экран *есть*. Он может быть графическим, и тогда (display-graphic-p) истинно, а может быть — нет, и тогда — ложно.

Если запущен демоном, то экрана нет. И (display-graphic-p) ложно.

Что тут может быть непонятно?

Zmicier ★★★★★
()
Ответ на: комментарий от Hertz
alias et=emacsclient -t -a ""
alias eg=emacsclient -c -a ""

Если alternate-editor пустой, при первом запуске стартует сервер и клиент, при последующих только клиент.

feofan ★★★★★
()
Ответ на: комментарий от Deleted

Кстати, а зачем лично Вам серверный режим?

Ну а как иначе? Отказаться от возможности открыть файл извне Емакса?

Да даже от элементарной возможности просто новое окно открыть, не вызывая вперед уже открытое?

Zmicier ★★★★★
()
Ответ на: комментарий от Deleted

А делаю я вот как.

Вы в любом случае занимаетесь костылением.

(load-theme) тему не только загрузит, но и включит *во всех* рамках.

А вам надо разобраться, почему ваша любимая тема криво выглядит в вашем любимом телетайпе. Не исключено, это баг темы — думаю, что художник просто не взял в голову, что телетайпы еще существуют — и надо помочь ему его исправить.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Ага, замешает две темы в одну. :-)

Бывает, да. Но я пользуюсь одной темой и в консоли и в иксах. Точнее, я меняю тему от времени суток с помощью circadian, а не в зависимости от того, иксы это или нет. Тем более, что со свежим emacs'ом, как я писал выше, оно выглядит одинаково.

А чтобы не смешивало надо делать вместо load-theme load-file

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 1)
Ответ на: комментарий от feofan
emacs --daemon --debug-init
# нет вывода
emacsclient -c

После C-x 5 2 установилась графическая тема.

Теперь рассказываю, что смущает. Если в качестве графической темы установить 'zenburn', а в качестве консольной 'wheatgrass', то при C-x 5 2 установился zenburn. В случае же с моей самодельной минималистичной темой (в которой многие цвета явно не прописаны), происходит замещение недостающих цветов из 'wheatgrass'. Т.е. темы сливаются. Чего не было в режиме без сервера.

Ну ок. А как сделать C-x 5 2 автоматическим при запуске?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

минималистичной темой (в которой многие цвета явно не прописаны), происходит замещение недостающих цветов из 'wheatgrass'.

Как такое победить я не знаю.

C-x 5 2

Это make-frame-command. Создавать новый фрейм при запуске не самая лучшая идея. Странно, что emacsclient при первом запуске не дергает этот хук. Наверняка есть другой подходящий (в emacs есть крючки на все случаи жизни), но сходу найти не могу. А что если не создавать новый фрейм явно, а сделать:

emacs --daemon
emacsclient -c
emacsclient -c
какое поведение?

UPDATE: нашел focus-in-hook. Должно тебе помочь. Сам переделать код на его использование сможешь?

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 2)
Ответ на: комментарий от feofan

Как такое победить я не знаю.

Нужно явно прописать все цвета в теме, не оставляя ничего дефолтного. Иначе подставляются цвета из другой темы (это поведение присутствует только в серверном режиме).

какое поведение?

такое же. Т.е. на второй раз запускается тема, презназначенная для иксов.

Deleted
()
Ответ на: комментарий от feofan
(defun my-set-theme ()
  "Set frame theme"
  (if (display-graphic-p)
      (load-theme 'my_theme_for_x11 t)
    (ding)
    (load-theme 'my_theme_for_console)))

(add-hook 'focus-in-hook 'my-set-theme)
feofan ★★★★★
()
Ответ на: комментарий от feofan

вот что пишет:

Waiting for Emacs...
*ERROR*: Wrong number of arguments: (lambda nil "Set frame theme" (if (display-graphic-p) (load-theme (quote zenburn) t) (ding) (load-theme (quote wheatgrass)))), 1

Deleted
()
Ответ на: комментарий от feofan

ошибка пропала (наверное, сначала что-то не так скопировал). Теперь запускается без ошибок. Тема при запуске - графическая. Затем вызываю в отдельном терминале emacsclient -nw -c. При возврате в первоначальное окно emacs возникает консольная тема. Если так попрыгать ещё, то темы вообще сливаются (zenburn + wheatgrass).

Deleted
()
Ответ на: комментарий от feofan

Ага, замешает две темы в одну. :-)

Бывает, да.

Ну, строго говоря, он всегда замещает. Просто в ряде случаев это не заметно глазу. :-)

А чтобы не смешивало надо делать вместо load-theme load-file

Ну, в данном-то случае ни к чему, насколько я понимаю. По идее костыля она должна включаться, так что можно и (load-theme), просто перед этим *выключить* те, что уже могли оказаться загружены ранее (disable-theme).

Но толк от этого будет только если мы не будем пользоваться иксами и телетайпом одновременно.

Zmicier ★★★★★
()
Ответ на: комментарий от feofan

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

Ну, во-первых, наверняка есть, просто не рекламируемая, я не разбирался.

А правильное-то решение — исправить *тему* так, чтобы она сама прекратила применяться на тех рамках, где у нее это плохо получается (на самом деле не в телетайпе, а при недостатке цветности, как я понял, то есть (min-colors ...), а не (type graphic)) — товарищ почему-то упорно игнорирует и держится намерения костылить.

Если при этом очень хочется видеть в малоцветном телетайпе что-то неискоробочное, то никто не мешает сделать и наоборот — изменить любую другую тему так, чтобы она применялась только там. (Это, впрочем, уже отправлять патчем уже, наверное, ни к чему. :-)

И включить их вместе, да.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от feofan

Как такое победить я не знаю.

А это, как я понял, имеется в виду ровно то самое, о чем мы беседовали, — они «замешались».

early_britney_fun, то есть повторю теперь специально вас :-), что лишнюю тему достаточно просто выключить: (disable-theme ...).

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

zenburn

А правильное-то решение — исправить *тему* так, чтобы она сама прекратила применяться на тех рамках, где у нее это плохо получается...

Так, early_britney_fun, мне за вас, я так понял, смотреть?

«Дзенберн» — это которая Бацова, да? Ну там образцовое:

(defmacro zenburn-with-color-variables (&rest body)
  "`let' bind all colors defined in `zenburn-colors-alist' around BODY.
Also bind `class' to ((class color) (min-colors 89))."
  (declare (indent 0))
  `(let ((class '((class color) (min-colors 89)))
...
— переменную определим.
...
   `(default ((t (:foreground ,zenburn-fg :background ,zenburn-bg))))
   `(cursor ((t (:foreground ,zenburn-fg :background ,zenburn-fg+1))))
   `(escape-glyph ((t (:foreground ,zenburn-yellow :weight bold))))
   `(fringe ((t (:foreground ,zenburn-fg :background ,zenburn-bg+1))))
              ^
             ^^^
...
— но использовать не будем. :-)

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

можно и (load-theme), просто перед этим *выключить* те, что уже могли оказаться загружены ранее (disable-theme).

спасибо, не знал.

feofan ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.