Diferentes temas para marcos terminales y gráficos cuando se usa el demonio Emacs

20

Estoy tratando de lograr el siguiente comportamiento en Emacs24:

Me gusta usar un tema diferente (solarized-dark vs solarized-light) dependiendo de si me conecto al servidor en ejecución con un marco de terminal

% emacsclient -t

o con un marco gtk

% emacsclient -c

Esto parece haber funcionado en Emacs anteriores, pero en el Emacs actual no pude encontrar una manera. Ya verifiqué SO (por ejemplo, /programming//q/18904529/152439 y respuestas) y las listas de correo (por ejemplo, https://lists.gnu.org/archive/html/help-gnu-emacs/ 2012-02 / msg00227.html y https://lists.gnu.org/archive/html/help-gnu-emacs/2012-02/msg00237.html ).

Mi configuración actual se ve así:

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

El problema con esto es que si tengo un marco gráfico abierto y luego abro un marco terminal con emacsclient -t, el tema solarized-dark se aplica tanto al nuevo marco terminal (que es correcto) como al marco gráfico ya abierto (que debería dejarse intacto, idealmente). El equivalente ocurre cuando un marco terminal ya está abierto y abro un nuevo marco gráfico con emacsclient -c.

EDITAR: En caso de que esto no sea posible con Emacs24 actual, ¿hay algún plan para hacerlo posible nuevamente?

andreas-h
fuente
1
Afaik (de otra búsqueda para este mismo propósito), la antigua implementación del tema de color permitió algunas configuraciones por búfer. Con emacs 24 vino un soporte de tema incorporado (conocido como deftheme o load-theme), que no admite esto: el tema es el mismo para toda la sesión de emacs. Para este tipo de configuración, tal vez pueda administrar un hack aceptable cargando siempre solarized-dark y usando la bandera -rv para iniciar los cuadros gráficos, pero estará lejos de ser perfecto.
T. Verron
Una solución alternativa es ejecutar clientes separados para el terminal y para la GUI como se describe aquí: emacs.stackexchange.com/q/41/93 Dependiendo de su flujo de trabajo, esta puede no ser una solución factible. A mí me funciona porque estoy haciendo diferentes tipos de tareas en cada una, con poca o ninguna superposición.
nispio
Si el tema personalizado incorporado en emacs24 no se ajusta a sus necesidades, siempre puede usar color-theme.elqué IIRC tenía una configuración de color dependiente del marco. No hay una gran ventaja en el uso de las capacidades incorporadas de temas aparte de la ubicuidad.
Vamsi
2
color-theme-buffer-local proporciona soporte de temas de buffer-local para ambos color-themey los sistemas de temas Emacs 24. Mi versión del tema solarizado también es compatible con ambos sistemas, si decides seguir esta ruta.
sanityinc
@sanityinc Gracias; Estoy usando Emacs 24.3, y parece haber algunos problemas, vea github.com/vic/color-theme-buffer-local/issues/5 . Pero vigilaré el proyecto.
andreas-h

Respuestas:

8

No puedes hacer esto usando diferentes temas. La solución es crear un tema que tenga diferentes definiciones de caras según el terminal. Si observa un ejemplo como font-lock-comment-face, verá cómo funciona. En lugar de especificar ((class color) (min-colors 88) (background dark)), también puede especificar (type tty)o (type graphic)etc. El manual tiene más información .

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

Supongo que podría escribir una función que tome dos temas y produzca un tema combinado, con caras de un tema asignadas (type tty)y caras del otro tema asignadas (type graphic)donde ambos temas originales se usan t.

Alex Schröder
fuente
6

color-theme-buffer-local proporciona soporte de temas de buffer-local para los sistemas de temas color-theme y Emacs 24. Mi versión del tema solarizado también es compatible con ambos sistemas, si decides seguir esta ruta.

sanityinc
fuente
gracias por el puntero a tu versión de solarizado, me gusta mucho!
andreas-h
2

Puede definir condiciones para las personalizaciones faciales, como "modo terminal" o "colores mínimos" en el editor de personalización:

Al personalizar una cara, haga clic en el botón [Estado] y seleccione "Mostrar todas las especificaciones de visualización". Luego puede configurar las condiciones para una mayor especialización de la cara.

Aquí hay una variante mínima para establecer el color de fondo en negro cuando el marco es un tty:

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