Verschiedene Themen für Terminal- und Grafikrahmen bei Verwendung des Emacs-Daemons

20

Ich versuche in Emacs24 folgendes Verhalten zu erreichen:

Ich verwende gerne ein anderes Thema (Solarized-Dark vs. Solarized-Light), je nachdem, ob ich mit einem Terminal-Frame eine Verbindung zum laufenden Server herstelle

% emacsclient -t

oder mit einem GTK-Rahmen

% emacsclient -c

Dies scheint in älteren Emacs funktioniert zu haben, aber mit den aktuellen Emacs konnte ich keinen Weg finden. Ich alreday geprüft SO (zB /programming//q/18904529/152439 und Antworten) und die Mailinglisten (zB https://lists.gnu.org/archive/html/help-gnu-emacs/ 2012-02 / msg00227.html und https://lists.gnu.org/archive/html/help-gnu-emacs/2012-02/msg00237.html ).

Mein aktuelles Setup sieht so aus:

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

Das Problem dabei ist, dass, wenn ich einen Grafikrahmen geöffnet habe und dann einen Terminalrahmen mit öffne emacsclient -t, das Thema solarized-dark sowohl auf den neuen Terminalrahmen (der korrekt ist) als auch auf den bereits geöffneten Grafikrahmen (der belassen werden sollte) angewendet wird unberührt, idealerweise). Das Gleiche passiert, wenn ein Terminal-Frame bereits geöffnet ist und ich einen neuen Grafik-Frame mit öffne emacsclient -c.

EDIT: Falls dies mit dem aktuellen Emacs24 nicht möglich ist, gibt es Pläne, dies wieder zu ermöglichen?

andreas-h
quelle
1
Afaik (von einer anderen Suche für diesen Zweck), die alte Farbdesign-Implementierung erlaubte einige Einstellungen pro Puffer. Mit Emacs 24 wurde eine integrierte Theme-Unterstützung (Deftheme oder Load-Theme) eingeführt, die dies nicht unterstützt: Das Theme ist für die gesamte Emacs-Sitzung gleich. Für diese Art der Einrichtung können Sie vielleicht einen akzeptablen Hack verwalten, indem Sie immer solarized-dark laden und das -rv-Flag verwenden, um die Grafikrahmen zu starten, aber es ist alles andere als perfekt.
T. Verron
Eine Problemumgehung besteht darin, separate Clients für das Terminal und die GUI auszuführen, wie hier beschrieben: emacs.stackexchange.com/q/41/93 Abhängig von Ihrem Workflow ist dies möglicherweise keine praktikable Lösung. Es funktioniert für mich, weil ich in jedem unterschiedliche Arten von Aufgaben erledige, mit wenig oder keiner Überlappung.
Nispio
Wenn das in emacs24 eingebaute Customt-Theming nicht Ihren Anforderungen entspricht, können Sie immer verwenden, bei color-theme.elwelchem ​​IIRC rahmenabhängige Farbeinstellungen vorgenommen wurden. Abgesehen von der Allgegenwart bietet die Verwendung der integrierten Theming-Funktionen keinen großen Vorteil.
Vamsi
2
color-theme-buffer-local bietet Unterstützung für color-themepufferlokale Themen sowohl für das Emacs 24-Themensystem als auch für das Emacs 24-Themensystem. Meine Version des solarisierten Themas unterstützt auch beide Systeme, wenn Sie sich für diesen Weg entscheiden.
Sanityinc
@sanityinc Danke; Ich verwende Emacs 24.3 und es scheint einige Probleme zu geben, siehe github.com/vic/color-theme-buffer-local/issues/5 . Aber ich werde das Projekt im Auge behalten.
andreas-h

Antworten:

8

Sie können dies nicht mit verschiedenen Themen tun. Die Lösung besteht darin, ein Thema zu erstellen, das je nach Terminal unterschiedliche Gesichtsdefinitionen aufweist. Wenn Sie sich ein Beispiel wie dieses ansehen font-lock-comment-face, werden Sie sehen, wie es funktioniert. Anstatt anzugeben ((class color) (min-colors 88) (background dark))könnten Sie auch angeben (type tty)oder (type graphic)usw. Das Handbuch enthält weitere Informationen .

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

Sie könnten eine Funktion schreiben, die zwei Themen verwendet und ein zusammengeführtes Thema erzeugt, wobei Gesichter eines Themas zugewiesen werden (type tty)und Gesichter des anderen Themas zugewiesen werden, (type graphic)wenn beide ursprünglichen Themen verwendet werden t.

Alex Schröder
quelle
6

color-theme-buffer-local bietet Unterstützung für pufferlokale Themen sowohl für Color-Theme- als auch für Emacs 24-Themensysteme. Meine Version des solarisierten Themas unterstützt auch beide Systeme, wenn Sie sich für diesen Weg entscheiden.

sanityinc
quelle
danke für den hinweis auf deine version von solarized, ich mag es wirklich!
andreas-h
2

Sie können im Anpassungseditor Bedingungen für Gesichtsanpassungen wie "Terminalmodus" oder "Minimalfarben" definieren:

Klicken Sie beim Anpassen eines Gesichts auf die Schaltfläche [Status] und wählen Sie "Alle Anzeigespezifikationen anzeigen". Dann können Sie die Bedingungen für eine weitere Spezialisierung des Gesichts festlegen.

Hier ist eine minimale Variante, um die Hintergrundfarbe auf Schwarz zu setzen, wenn der Rahmen eine Tty ist:

(custom-set-faces
 '(default (
            (((type tty) (min-colors 256))
             (:background "black"))
            (t
             (:background "#181a26")))
    ))
TheJJ
quelle