Différents thèmes pour les cadres terminaux et graphiques lors de l'utilisation du démon Emacs

20

J'essaie d'obtenir le comportement suivant dans Emacs24:

J'aime utiliser un thème différent (solarized-dark vs solarized-light) selon que je me connecte au serveur en cours d'exécution avec un châssis de terminal

% emacsclient -t

ou avec un cadre gtk

% emacsclient -c

Cela semble avoir fonctionné dans les anciens Emacs, mais les Emacs actuels, je ne pouvais pas trouver un moyen. J'ai déjà vérifié SO (par exemple, /programming//q/18904529/152439 et réponses) et les listes de diffusion (par exemple, https://lists.gnu.org/archive/html/help-gnu-emacs/ 2012-02 / msg00227.html et https://lists.gnu.org/archive/html/help-gnu-emacs/2012-02/msg00237.html ).

Ma configuration actuelle ressemble à ceci:

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

Le problème avec cela est que si j'ai un cadre graphique ouvert puis j'ouvre un cadre terminal avec emacsclient -t, le thème solarized-dark est appliqué à la fois au nouveau cadre terminal (qui est correct) et au cadre graphique déjà ouvert (qui devrait être laissé intacte, idéalement). L'équivalent se produit lorsqu'un cadre terminal est déjà ouvert et j'ouvre un nouveau cadre graphique avec emacsclient -c.

EDIT: Si cela n'est pas possible avec Emacs24 actuel, est-il prévu de le rendre à nouveau possible?

andreas-h
la source
1
Afaik (à partir d'une autre recherche à cet effet), l'ancienne implémentation du thème de couleur permettait certains paramètres par tampon. Avec emacs 24 est venu un support de thème intégré (connu sous le nom de deftheme ou load-theme), qui ne le supporte pas: le thème est le même pour toute la session emacs. Pour ce type de configuration, vous pouvez peut-être gérer un hack acceptable en chargeant toujours solarized-dark et en utilisant l'indicateur -rv pour démarrer les cadres graphiques, mais ce sera loin d'être parfait.
T. Verron
Une solution de contournement consiste à exécuter des clients distincts pour le terminal et l'interface graphique, comme indiqué ici: emacs.stackexchange.com/q/41/93 Selon votre flux de travail, cela peut ne pas être une solution réalisable. Cela fonctionne pour moi car je fais différents types de tâches dans chacun, avec peu ou pas de chevauchement.
nispio
Si le thème personnalisé intégré dans emacs24 ne correspond pas à vos besoins, vous pouvez toujours utiliser le color-theme.elIIRC qui avait des paramètres de couleur dépendant du cadre. Il n'y a pas de grand avantage à utiliser les capacités de thème intégrées en dehors de l'ubiquité.
Vamsi
2
color-theme-buffer-local fournit une prise en charge du thème buffer-local pour les color-themesystèmes de thème Emacs 24. Ma version du thème solarisé prend également en charge les deux systèmes, si vous décidez de suivre cette voie.
sanityinc
@sanityinc Merci; J'utilise Emacs 24.3, et il semble y avoir des problèmes, voir github.com/vic/color-theme-buffer-local/issues/5 . Mais je garderai un œil sur le projet.
andreas-h

Réponses:

8

Vous ne pouvez pas le faire en utilisant différents thèmes. La solution consiste à créer un thème ayant différentes définitions de visages en fonction du terminal. Si vous regardez un exemple comme font-lock-comment-face, vous verrez comment cela fonctionne. Au lieu de spécifier, ((class color) (min-colors 88) (background dark))vous pouvez également spécifier (type tty)ou (type graphic)etc. Le manuel contient plus d'informations .

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

Je suppose que vous pourriez écrire une fonction qui prend deux thèmes et produit un thème fusionné, avec des visages d'un thème attribués (type tty)et des visages de l'autre thème attribués (type graphic)là où les deux thèmes originaux sont utilisés t.

Alex Schröder
la source
6

color-theme-buffer-local fournit une prise en charge du thème buffer-local pour les systèmes de thème couleur et Emacs 24. Ma version du thème solarisé prend également en charge les deux systèmes, si vous décidez de suivre cette voie.

sanityinc
la source
merci pour le pointeur vers votre version de solarized, j'aime beaucoup!
andreas-h
2

Vous pouvez définir des conditions pour les personnalisations de visage, comme le "mode terminal" ou les "couleurs minimales" dans l'éditeur de personnalisation:

Lors de la personnalisation d'un visage, cliquez sur le bouton [État] et sélectionnez "Afficher toutes les spécifications d'affichage". Ensuite, vous pouvez définir les conditions d'une spécialisation plus poussée du visage.

Voici une variante minimale pour définir la couleur d'arrière-plan sur noir lorsque le cadre est un tty:

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