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?


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.



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")))
    ))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.