Temi diversi per i frame terminali e grafici quando si usa il demone Emacs


20

Sto cercando di ottenere il seguente comportamento in Emacs24:

Mi piace usare un tema diverso (solarized-dark vs. solarized-light) a seconda che mi connetta al server in esecuzione con un frame terminale

% emacsclient -t

o con una cornice GTK

% emacsclient -c

Questo sembra aver funzionato negli Emacs più vecchi, ma gli attuali Emacs non sono riuscito a trovare un modo. Ho sempre controllato SO (ad es. Https://stackoverflow.com/q/18904529/152439 e risposte) e le mailing list (ad es. Https://lists.gnu.org/archive/html/help-gnu-emacs/ 2012-02 / msg00227.html e https://lists.gnu.org/archive/html/help-gnu-emacs/2012-02/msg00237.html ).

La mia configurazione attuale è simile a questa:

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

Il problema è che se ho una cornice grafica aperta e quindi apro una cornice terminale con emacsclient -t, il tema solarized-dark viene applicato sia alla nuova cornice terminale (che è corretta) sia alla cornice grafica già aperta (che dovrebbe essere lasciata intatto, idealmente). L'equivalente accade quando un frame terminale è già aperto e apro un nuovo frame grafico con emacsclient -c.

EDIT: Nel caso in cui ciò non fosse possibile con l'attuale Emacs24, ci sono piani per renderlo di nuovo possibile?


1
Afaik (da altre ricerche proprio per questo scopo), la vecchia implementazione del tema colore consentiva alcune impostazioni per buffer. Con emacs 24 è arrivato un supporto tematico integrato (noto come deftheme o load-theme), che non supporta questo: il tema è lo stesso per l'intera sessione di emacs. Per questo tipo di installazione, forse puoi gestire un hack accettabile caricando sempre solarized-dark e usando il flag -rv per avviare i frame grafici, ma sarà tutt'altro che perfetto.
T. Verron,

Una soluzione alternativa consiste nell'eseguire client separati per il terminale e per la GUI, come discusso qui: emacs.stackexchange.com/q/41/93 A seconda del flusso di lavoro, questa potrebbe non essere una soluzione fattibile. Funziona per me perché sto svolgendo diversi tipi di compiti in ciascuno, con poca o nessuna sovrapposizione.
nispio,

Se il tema personalizzato incorporato in emacs24 non soddisfa le tue esigenze, puoi sempre utilizzare color-theme.elquale IIRC aveva impostazioni di colore dipendenti dalla cornice. Non vi è alcun grande vantaggio nell'utilizzare le capacità tematiche integrate oltre all'ubiquità.
Vamsi,

2
color-theme-buffer-local fornisce supporto del tema buffer-local per entrambi color-themee per i sistemi di temi Emacs 24. La mia versione del tema solarizzato supporta anche entrambi i sistemi, se decidi di seguire questa strada.
sanityinc

@sanityinc Grazie; Sto usando Emacs 24.3 e sembrano esserci dei problemi, vedi github.com/vic/color-theme-buffer-local/issues/5 . Ma terrò d'occhio il progetto.
andreas-h,

Risposte:


8

Non puoi farlo usando temi diversi. La soluzione è creare un tema che abbia definizioni di facce diverse a seconda del terminale. Se guardi un esempio come font-lock-comment-face, vedrai come funziona. Invece di specificare ((class color) (min-colors 88) (background dark))potresti anche specificare (type tty)o (type graphic)ecc. Il manuale contiene maggiori informazioni .

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

Immagino che potresti scrivere una funzione che prende due temi e produce un tema unito, con facce di un tema assegnate (type tty)e facce di un altro tema assegnate (type graphic)dove usano entrambi i temi originali t.



2

Nell'editor di personalizzazione è possibile definire le condizioni per le personalizzazioni del viso, come "modalità terminale" o "colori minimi":

Quando si personalizza una faccia, fare clic sul pulsante [Stato] e selezionare "Mostra tutte le specifiche di visualizzazione". Quindi è possibile impostare le condizioni per l'ulteriore specializzazione del viso.

Ecco una variante minima per impostare il colore di sfondo su nero quando la cornice è tty:

(custom-set-faces
 '(default (
            (((type tty) (min-colors 256))
             (:background "black"))
            (t
             (:background "#181a26")))
    ))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.