Запустите два отдельных демона emacs для консоли и графического интерфейса

14

Обычно я запускаю emacs с графическим интерфейсом и сразу запускаю сервер (server-start). Теперь я могу легко открывать документы в моем существующем сеансе emacs из терминала через emacsclient -n <file>или из браузера файлов.

Однако время от времени я хочу запускать emacs внутри моего терминала, используя emacsclient -t. Чаще всего это происходит при написании журналов git commit или выполнении других очень маленьких задач. В этих случаях тот факт, что мой файл инициализации был загружен в экземпляре emacs с графическим интерфейсом, означает, что я не получаю никаких настроек, относящихся к emacs TTY.

Я знаю, что я могу бежать

emacs -nw -q -l "some-custom-init-file.el"

но это перезагрузит все пакеты каждый раз. Могу ли я получить лучшее из обоих миров? Есть ли способ настроить «демон TTY», чтобы я мог использовать отдельные настройки для запуска внутри терминала вместо просмотра файла в существующем окне emacs?

nispio
источник
1
Можете ли вы указать на пример ваших настроек, которые отличаются между режимами TTY и GUI?
'41
1
@stsquad Одним из действительно простых является то, что я использую левую полосу в режиме графического интерфейса, но поскольку полоса не существует в режиме TTY, между номерами строк и текстом нет пробела. Это можно исправить с (setq linum-format "%d ")помощью файла настроек TTY. Кроме того, моя цветовая тема всегда выглядит странно в режиме TTY, поэтому я определенно выберу другую тему для TTY. На самом деле у меня сейчас не так много различий, но теперь, когда я знаю, что могу иметь разные серверы, список может увеличиться.
Ниспио
@nispio: Я предлагаю вам M-x report-emacs-bugи запрашиваю новые функции, такие как возможность иметь разные темы лица в TTY и в кадрах GUI (на самом деле, тема может указывать совершенно разные цвета для этих разных типов рамок, так что вы также можете настроить свою тему) , Использование нескольких демонов для этих отдельных случаев - это просто обходной путь для отсутствия соответствующей функциональности в Emacs.
Стефан

Ответы:

14

Используйте emacs --daemon=your-server-name -l "custom-init-file"для запуска нового сервера и emacsclient -nw -s your-server-nameподключения к нему с самого терминала. Раздел «Использование Emacs в качестве сервера» в руководстве имеет больше опций инициализации.

Vamsi
источник
Это работает! Есть ли хороший способ убить сервер, запущенный таким образом, кроме поиска и удаления файла сервера?
Ниспио
(Мне пришлось добавить -qпереключатель, чтобы не init.elзапускать настройки по умолчанию перед пользовательским файлом инициализации.)
nispio
2
Делай emacsclient -s your-server-name -e "(kill-emacs)"что хочешь? Вышесказанное просто называет истощением и злым умыслом (kill-emacs). Вы могли бы заменить (kill-emacs)с , (save-buffers-kill-emacs)а также.
Вамси
Раньше у меня был общий init.el для терминала и графического интерфейса пользователя, и я загружал отдельные файлы для индивидуальных настроек. Следовательно, я пропустил-q
Вамси
1
Это решение также устранило проблему, возникшую у меня при использовании emacsclient -t с mutt и в отдельной рабочей области emacsclient -c. Проще говоря: демон был сбой, когда 'emacsclient -c' был запущен до 'emacsclient -t'. Спасибо, Вамси
Boccaperta-IT
9

В дополнение к ответу @ Vamsi, вы можете получить многие из тех же преимуществ, работая только на одном сервере, прикрепив совет make-frame-command.

Например, во время работы в терминале я хочу, чтобы цвет фона был black(который отображается на #202020), но я хочу использовать #202020в графическом режиме. Я реализовал это с помощью:

(defadvice make-frame-command (after make-frame-change-background-color last activate)
  "Adjusts the background color for different frame types. 
Graphical (X) frames should have the theme color, while terminal frames should match the terminal color (which matches the theme color...but terminal frames can't directly render this color)"
    (if (display-graphic-p)
        (set-background-color "#202020")
      (set-background-color "black")))

Вы можете получить много пробега из этого используя make-variable-frame-local( set-background-colorв вышеупомянутом уже является frame-local).

Я не знаю, является ли это лучшим шаблоном, но если у вас относительно мало различий между TTY-режимом и X-режимом Emacs, это может упростить управление конфигурацией.

Приведенный выше код был взят из моего .emacs.d .

Дж Дэвид Смит
источник
Мне было интересно, есть ли какой-нибудь способ «определить», в каком режиме я нахожусь для каждого кадра.
Ниспио
1
Это сделает это. (display-graphic-p)дает, tесли текущий кадр является графическим, в nilпротивном случае. Поскольку кадры нельзя перемещать между графическими и нет (afaik), добавление рекомендаций по созданию кадров гарантирует, что желаемое состояние достигнуто для данного кадра.
Джей Дэвид Смит
Это, безусловно, самый удобный ответ.
Малабарба
4

Вам не нужен совет для изменения настроек разных фреймов, запущенных в одном и том же демоне emacs. Просто используйте крюк, after-make-frame-functionsкак так

(defvar my/ttheme 'tango-dark)
(defvar my/gtheme 'tango)
(defun my/frame-configuration (frame)
  "configure the current frame depending on the frame type"
  (with-selected-frame frame
    (if (display-graphic-p)
        (progn
          (message "after-make-frame-functions hook: window system")
          (set-frame-size frame 115 60)
          ;; other settings for a graphical frame
          (load-theme my/gtheme t))
      (message "after-make-frame-functions hook: text console")
      (load-theme my/ttheme t)
      (set-frame-parameter frame 'menu-bar-lines 0))))

(add-hook 'after-make-frame-functions 'my/frame-configuration)

;; normal start without daemon
(if (not (daemonp))
  (my/frame-configuration (selected-frame)))

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

К сожалению, load-themeэто не локальный фрейм, поэтому другие фреймы также окрашиваются, если вы действительно используете разные темы для текста и графических фреймов.

Дополнительная информация: настройте свои терминалы как минимум на 256 цветов, чтобы получить реальное ощущение выбранной вами темы. Используйте такую ​​настройку в одном из ваших файлов запуска оболочки:

TERM=xterm-256color
export TERM
Уве Колоска
источник
Не все терминалы поддерживают 256 цветов, например, xfce4-терминал по-прежнему всего 8 (я переключился на sakura для красивых цветов).
unhammer