Различные темы для терминальных и графических фреймов при использовании демона 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. Моя версия соляризованной темы также поддерживает обе системы, если вы решите пойти по этому пути.


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

2

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

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

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

(custom-set-faces
 '(default (
            (((type tty) (min-colors 256))
             (:background "black"))
            (t
             (:background "#181a26")))
    ))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.