Различные темы для терминальных и графических фреймов при использовании демона Emacs

20

Я пытаюсь добиться следующего поведения в Emacs24:

Мне нравится использовать другую тему (соляризованная темнота или соляризованная подсветка) в зависимости от того, подключаюсь ли я к работающему серверу с рамкой терминала

% emacsclient -t

или с рамкой GTK

% emacsclient -c

Кажется, это работало в более старых Emacs, но в текущем Emacs я не мог найти способ. Я уже проверял SO (например, /programming//q/18904529/152439 и ответы) и списки рассылки (например, https://lists.gnu.org/archive/html/help-gnu-emacs/ 2012-02 / msg00227.html и https://lists.gnu.org/archive/html/help-gnu-emacs/2012-02/msg00237.html ).

Моя текущая настройка выглядит так:

(add-to-list 'custom-theme-load-path "~/.emacs.d/themes/solarized")
(if (daemonp)
  (add-hook 'after-make-frame-functions
    (lambda (frame)
      (select-frame frame)
      (if (display-graphic-p frame)
        (load-theme 'solarized-light t)
        (load-theme 'solarized-dark t)
      )
    )
  )
  (load-theme 'solarized-light t)
)

Проблема в том, что если у меня есть открытая графическая рамка, а затем открываю рамку терминала emacsclient -t, тема solarized-dark применяется как к новой рамке терминала (что правильно), так и к уже открытой графической рамке (которую следует оставить нетронутый, в идеале). Эквивалент происходит, когда оконечная рамка уже открыта, и я открываю новую графическую рамку с помощью emacsclient -c.

РЕДАКТИРОВАТЬ: Если это невозможно с текущей Emacs24, есть ли планы сделать это снова?

андреас-ч
источник
1
Afaik (из другого поиска для этой цели), старая реализация цветовой темы допускала некоторые настройки для каждого буфера. В emacs 24 появилась встроенная поддержка тем (известная как deftheme или load-theme), которая не поддерживает это: тема одинакова для всего сеанса emacs. Для такого типа установки, возможно, вы можете управлять приемлемым хаком, всегда загружая соляризованную тьму и используя флаг -rv для запуска графических фреймов, но это будет далеко от совершенства.
Т. Веррон
Одним из обходных путей является запуск отдельных клиентов для терминала и для графического интерфейса, как описано здесь: emacs.stackexchange.com/q/41/93 В зависимости от вашего рабочего процесса, это может быть нереальным решением. Это работает для меня, потому что я выполняю различные типы задач в каждом, с небольшим или никаким перекрытием.
Ниспио
Если встроенная пользовательская тема в emacs24 не соответствует вашим потребностям, вы всегда можете использовать, color-theme.elкакие IIRC имели настройки цвета, зависящие от кадра. Нет большого преимущества в использовании встроенных возможностей тем, кроме повсеместности.
Вамси
2
color-theme-buffer-local обеспечивает поддержку буферных локальных тем как для color-themeсистем тем Emacs 24, так и для них. Моя версия соляризованной темы также поддерживает обе системы, если вы решите пойти по этому пути.
sanityinc
@sanityinc Спасибо; Я использую Emacs 24.3, и, похоже, есть некоторые проблемы, см. Github.com/vic/color-theme-buffer-local/issues/5 . Но я буду следить за проектом.
Андреас-ч

Ответы:

8

Вы не можете сделать это, используя разные темы. Решение состоит в том, чтобы создать тему с различными определениями лиц в зависимости от терминала. Если вы посмотрите на пример как font-lock-comment-face, вы увидите, как он работает. Вместо того, чтобы указывать, ((class color) (min-colors 88) (background dark))вы также можете указать (type tty)или (type graphic)др. В руководстве есть больше информации .

(defface font-lock-comment-face
  '((((class grayscale) (background light))
 :foreground "DimGray" :weight bold :slant italic)
(((class grayscale) (background dark))
 :foreground "LightGray" :weight bold :slant italic)
(((class color) (min-colors 88) (background light))
 :foreground "Firebrick")
(((class color) (min-colors 88) (background dark))
 :foreground "chocolate1")
(((class color) (min-colors 16) (background light))
 :foreground "red")
(((class color) (min-colors 16) (background dark))
 :foreground "red1")
(((class color) (min-colors 8) (background light))
 :foreground "red")
(((class color) (min-colors 8) (background dark))
 :foreground "yellow")
(t :weight bold :slant italic))
  "Font Lock mode face used to highlight comments."
  :group 'font-lock-faces)

Я полагаю, вы могли бы написать функцию, которая берет две темы и создает объединенную тему с назначением лиц из одной темы и назначений (type tty)лиц из другой темы, (type graphic)где используются обе исходные темы t.

Алекс Шредер
источник
6

color-theme-buffer-local обеспечивает поддержку буфера локальной темы как для color-theme, так и для систем тем Emacs 24. Моя версия соляризованной темы также поддерживает обе системы, если вы решите пойти по этому пути.

sanityinc
источник
спасибо за указатель на ваш вариант соляризации, мне очень нравится!
Андреас-ч
2

Вы можете определить условия для настройки лица, такие как «режим терминала» или «минимальные цвета» в редакторе настроек:

При настройке лица нажмите кнопку [State] и выберите «Показать все характеристики дисплея». Тогда вы сможете настроить условия для дальнейшей специализации лица.

Вот минимальный вариант для установки цвета фона на черный, если рамка имеет тип tty:

(custom-set-faces
 '(default (
            (((type tty) (min-colors 256))
             (:background "black"))
            (t
             (:background "#181a26")))
    ))
TheJJ
источник