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


20

Я намагаюся досягти такої поведінки в Emacs24:

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

% emacsclient -t

або з кадром gtk

% emacsclient -c

Це, здається, працювало в старих Emacs, але в поточному Emacs я не міг знайти спосіб. Я alreday перевірив 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.

EDIT: Якщо це неможливо з поточним Emacs24, чи є якісь плани зробити це знову можливим?


1
Afaik (з інших пошуків цієї самої мети), стара реалізація кольорової теми дозволила виконати деякі параметри буфера. З emacs 24 з'явилася вбудована підтримка теми (відома як deftheme або load-тема), яка не підтримує це: тема однакова для всього сеансу emacs. Для такого типу налаштувань, можливо, ви можете керувати прийнятним хаком, завжди завантажуючи соляризований темний та використовуючи прапор -rv для запуску графічних кадрів, але це буде далеко не ідеально.
Т. Веррон

Одне вирішення - це запуск окремих клієнтів для терміналу та для графічного інтерфейсу, про які йдеться тут: emacs.stackexchange.com/q/41/93 Залежно від вашого робочого процесу це може бути нереальним рішенням. Це працює для мене, тому що я виконую різні завдання в кожному, з невеликим перекриттям або без нього.
nispio

Якщо вбудована тематизація настроювання в emacs24 не відповідає вашим потребам, ви завжди можете використовувати, у color-theme.elякому IIRC були встановлені кольорові параметри кольору. Немає великої переваги у використанні вбудованих можливостей тематизації, крім повсюдності.
Вамсі

2
color-тема-буфер-локальний забезпечує підтримку локальної тематики буфера для обох color-themeі тематичних систем Emacs 24. Моя версія соляризованої теми також підтримує обидві системи, якщо ви вирішили пройти цей маршрут.
sanityinc

@sanityinc Спасибі; Я використовую Emacs 24.3, і, мабуть, є деякі проблеми, див. Github.com/vic/color-theme-buffer-local/isissue/5 . Але я буду стежити за проектом.
andreas-h

Відповіді:


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 забезпечує підтримку локальної тематики буфера для кольорових тем та тематичних систем Emacs 24. Моя версія соляризованої теми також підтримує обидві системи, якщо ви вирішили пройти цей маршрут.


дякую за вказівник на вашу версію соляризованого, мені це дуже подобається!
andreas-h

2

Ви можете визначити умови для налаштування обличчя, наприклад "термінальний режим" або "мінімальні кольори" в редакторі налаштування:

Під час налаштування обличчя натисніть кнопку [State] та виберіть "Показати всі характеристики дисплея". Тоді ви можете встановити умови для подальшої спеціалізації обличчя.

Ось мінімальний варіант, щоб встановити колір фону в чорний, коли кадр є тти:

(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.