2013-04-09 10 views
6

mi piace vedere se c'è un modo per cambiare il piano modalità-link e background base colore sulle principali modalità,Cambia il colore Emacs modalità riga sulla base di importanti modalità

Stavo pensando di aggiungere la logica nel

(add-hook 'after-change-major-mode-hook 

Ma, non ho tutte le Emacs Lisp esperienza per fare tale cambiamento. Ecco la logica:

switch major-mode: 
case "emacs-lisp-mode": 
    (set-face-foreground 'mode-line "ivory") 
    (set-face-background 'mode-line "DarkOrange2") 
case "ruby-mode": 
    (set-face-foreground 'mode-line "white") 
    (set-face-background 'mode-line "red") 
... 
default: 
    (set-face-foreground 'mode-line "black") 
    (set-face-background 'mode-line "white") 
end switch 

Molte grazie in anticipo !.

risposta

9

probabilmente si desidera qualcosa di simile:

(add-hook 'emacs-lisp-mode-hook 
      (lambda() 
      (face-remap-add-relative 
      'mode-line '((:foreground "ivory" :background "DarkOrange2") mode-line)))) 

Si potrebbe desiderare di utilizzare faccia remap per il viso mode-line-inactive pure.

+0

GRAZIE MOLTO. Funziona magnificamente :) Saresti anche gentile ad aiutarmi a combinare il tuo add-hook usando un elenco predefinito? Simile al suggerimento "sds", ma aggiungere-hook a tutte le modalità nella lista predefinita con i colori? Grazie! –

+0

Vuoi dire come '(dolist (x '((emacs-lisp-mode: foreground" avorio ": background" DarkOrange2 ") (ruby-mode: foreground" white ": background" red "))) (aggiungi-hook (interno (concat (nome-simbolo (auto x)) "-mode")) (lambda() (face-remap-add-relative 'mode-line (cons (cdr x)' (mode-line))))))) "Attenzione però che funzionerà solo con un buffer' lessical-binding: t'. – Stefan

3

"La logica" si sta parlando è qualcosa di simile:

(add-hook 'after-change-major-mode-hook 'my-set-mode-line-colors) 
(defvar my-mode-line-colors 
    '((emacs-lisp-mode :foreground "ivory" :background "DarkOrange2") 
    (ruby-mode :foreground "white" :background "red"))) 
(defun my-set-mode-line-colors() 
    (face-remap-add-relative 
    'mode-line (list (or (cdr (assq major-mode my-mode-line-colors)) 
         '(:foreground "black" :background "white")) 
        'mode-line))) 

In alternativa, si può fare a ganci alle diverse modalità, come suggerito da Stefan.

+0

In realtà avevo il gancio aggiuntivo per ciascuna modalità. Ma quando cambio il buffer da Ruby a Lisp, ecc., La linea di modo non ha ottenuto l'aggiornamento .. Quindi ho pensato a "change-major-mode-hook" e hai ragione, né funziona neanche ... è che buffer-switch-hook? Ho provato a cercare qualcosa di simile, ma senza risultato. Grazie! –

+0

Il problema, come ho scritto, è che le facce di emacs non sono buffer-local, quindi le chiamate di set-face in primo piano interesseranno tutte le finestre e tutte le linee di modalità. Non è possibile impostare l'aspetto della linea della modalità specifica del buffer – sds

+0

per impostare il set-face-foreground per frame. anche se ho cornici multiple, posso cambiare la linea di modo solo per quel fotogramma ... finché posso dire quando un buffer è acceso e spento e cambia la linea di modo, dovrebbe funzionare .. –

Problemi correlati