Różne motywy dla terminali i ramek graficznych podczas korzystania z demona Emacsa

20

Próbuję osiągnąć następujące zachowanie w Emacs24:

Lubię używać innego motywu (solarized-dark vs. solarized-light) w zależności od tego, czy połączę się z działającym serwerem za pomocą ramki terminala

% emacsclient -t

lub z ramką GTK

% emacsclient -c

Wydaje się, że działało to w starszych Emacsach, ale obecnego Emacsa nie mogłem znaleźć sposobu. Już raz sprawdzałem SO (np. Https://stackoverflow.com/q/18904529/152439 i odpowiedzi) oraz listy mailingowe (np. Https://lists.gnu.org/archive/html/help-gnu-emacs/ 2012-02 / msg00227.html i https://lists.gnu.org/archive/html/help-gnu-emacs/2012-02-02/msg00237.html ).

Moja obecna konfiguracja wygląda następująco:

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

Problem polega na tym, że jeśli mam otwartą ramkę graficzną, a następnie otwieram ramkę terminala emacsclient -t, motyw solarized-dark zostaje zastosowany zarówno do nowej ramki terminala (co jest poprawne), jak i już otwartej ramki graficznej (którą należy pozostawić idealnie nietknięte). Odpowiednik dzieje się, gdy ramka terminala jest już otwarta, a ja otwieram nową ramkę graficzną za pomocą emacsclient -c.

EDYCJA: Jeśli nie jest to możliwe w przypadku obecnych Emacs24, czy są jakieś plany, aby to umożliwić ponownie?

andreas-h
źródło
1
Afaik (z innych poszukiwań tego właśnie celu), stara implementacja motywu kolorów pozwalała na pewne ustawienia dla poszczególnych buforów. W emacs 24 pojawiła się wbudowana obsługa motywów (znana jako deftheme lub load-theme), która tego nie obsługuje: motyw jest taki sam dla całej sesji emacs. W przypadku tego rodzaju konfiguracji może uda ci się zarządzać akceptowalnym włamaniem, zawsze ładując solarized-dark i używając flagi -rv do uruchomienia ramek graficznych, ale będzie to dalekie od ideału.
T. Verron
Jednym z obejść jest uruchomienie osobnych klientów dla terminala i GUI, jak omówiono tutaj: emacs.stackexchange.com/q/41/93 W zależności od przepływu pracy może to nie być wykonalnym rozwiązaniem. Działa to dla mnie, ponieważ wykonuję różne rodzaje zadań w każdym, z niewielkim lub żadnym nakładaniem się.
nispio
Jeśli wbudowane niestandardowe motywy w emacs24 nie pasują do twoich potrzeb, zawsze możesz użyć, color-theme.elktóry IIRC miał ustawienia kolorów zależne od ramki. Korzystanie z wbudowanych funkcji tematycznych nie jest wielką zaletą oprócz wszechobecności.
Vamsi
2
color-theme-buffer-local zapewnia obsługę lokalnego bufora dla obu color-themesystemów Emacs 24. Moja wersja motywu słonecznego obsługuje również oba systemy, jeśli zdecydujesz się wybrać tę trasę.
sanityinc
@sanityinc Thanks; Używam Emacsa 24.3 i wydaje się, że są pewne problemy, patrz github.com/vic/color-theme-buffer-local/issues/5 . Ale będę pilnować projektu.
andreas-h

Odpowiedzi:

8

Nie możesz tego zrobić przy użyciu różnych motywów. Rozwiązaniem jest stworzenie motywu, który ma różne definicje twarzy w zależności od terminala. Jeśli spojrzysz na przykład taki font-lock-comment-face, zobaczysz, jak to działa. Zamiast określać ((class color) (min-colors 88) (background dark))Można też specifcy (type tty)lub (type graphic)itd. Instrukcja zawiera więcej informacji .

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

Wydaje mi się, że można napisać funkcję, która pobiera dwa motywy i tworzy scalony motyw, z przypisanymi ścianami z jednego motywu (type tty)i twarzami z drugiego motywu w (type graphic)przypadku użycia obu oryginalnych motywów t.

Alex Schröder
źródło
6

color-theme-buffer-local zapewnia obsługę lokalnego bufora dla kolorów i motywów Emacsa 24. Moja wersja motywu słonecznego obsługuje również oba systemy, jeśli zdecydujesz się wybrać tę trasę.

sanityinc
źródło
dzięki za wskaźnik do twojej wersji solaryzowanej, naprawdę mi się podoba!
andreas-h
2

Możesz zdefiniować warunki dostosowywania twarzy, takie jak „tryb terminala” lub „minimalne kolory” w edytorze dostosowywania:

Podczas dostosowywania twarzy kliknij przycisk [Stan] i wybierz „Pokaż wszystkie parametry wyświetlania”. Następnie możesz skonfigurować warunki do dalszej specjalizacji twarzy.

Oto minimalny wariant ustawienia koloru tła na czarny, gdy ramka jest tty:

(custom-set-faces
 '(default (
            (((type tty) (min-colors 256))
             (:background "black"))
            (t
             (:background "#181a26")))
    ))
TheJJ
źródło