Crea una funzione per attivare / disattivare i temi


8

Come potrei creare una funzione interattiva per alternare tra due temi di colore?

Da quello che sono stato in grado di trovare non esiste una variabile impostata su quale tema di colore è attualmente in uso, in effetti diversi possono essere caricati contemporaneamente?

Inoltre, per attivare / disattivare è necessario prima fare disable-themeil tema attualmente caricato, per non scontrarsi con i temi.

Come farlo senza sapere quale tema è attualmente caricato?


2
(car custom-enabled-themes)restituisce il tema attualmente abilitato.
Mutbuerger


Usa solo il tema di caricamento del consiglio, se usi il consiglio.
InHarmsWay

Risposte:


4

L'ho fatto ma cambio 3 temi (My kosmos, leuven e default)

Puoi controllare https://github.com/habamax/.emacs.d/blob/master/lisp/haba-appearance.el

estratto da esso:

(defvar *haba-theme-dark* 'kosmos)
(defvar *haba-theme-light* 'leuven)
(defvar *haba-current-theme* *haba-theme-dark*)

;; disable other themes before loading new one
(defadvice load-theme (before theme-dont-propagate activate)
  "Disable theme before loading new one."
  (mapcar #'disable-theme custom-enabled-themes))


(defun haba/next-theme (theme)
  (if (eq theme 'default)
      (disable-theme *haba-current-theme*)
    (progn
      (load-theme theme t)))
  (setq *haba-current-theme* theme))

(defun haba/toggle-theme ()
  (interactive)
  (cond ((eq *haba-current-theme* *haba-theme-dark*) (haba/next-theme *haba-theme-light*))
        ((eq *haba-current-theme* *haba-theme-light*) (haba/next-theme 'default))
        ((eq *haba-current-theme* 'default) (haba/next-theme *haba-theme-dark*))))

Quindi associa qualche chiave al tema haba / toggle.

Uso emacs su 2 macchine e ambienti diversi (giorno, tarda sera), quindi esiste la possibilità di salvare / ripristinare il tema corrente su quit / load emacs. È utile :)


5

Ho scritto alcune funzioni per scorrere un gruppo di temi.

(setq ivan/themes '(elixir elixir-dark))
(setq ivan/themes-index 0)

(defun ivan/cycle-theme ()
  (interactive)
  (setq ivan/themes-index (% (1+ ivan/themes-index) (length ivan/themes)))
  (ivan/load-indexed-theme))

(defun ivan/load-indexed-theme ()
  (ivan/try-load-theme (nth ivan/themes-index ivan/themes)))

(defun ivan/try-load-theme (theme)
  (if (ignore-errors (load-theme theme :no-confirm))
      (mapcar #'disable-theme (remove theme custom-enabled-themes))
    (message "Unable to find theme file for ‘%s’" theme)))

Chiamo il ivan/load-indexed-thememio file init per inizializzare il mio tema.

Mi associo ivan/cycle-themea Space\in modalità malvagia. ( Spaceè la mia chiave leader.)


2

Anche se le risposte esistenti funzionano bene, vorrei condividerne una più semplice:

(defun toggle-theme ()
  (interactive)
  (if (eq (car custom-enabled-themes) 'leuven)
      (disable-theme 'leuven)
    (enable-theme 'leuven)))
(global-set-key [f5] 'toggle-theme)

Questo non disabilita prima il tema personalizzato predefinito, ma mi piace.


1

Questo è il modulo che ho scritto per il mio .emacs per risolvere questo problema. Il mio approccio di base sembra essere simile nell'intento alla soluzione di Maxim Kim (ruotando attraverso un elenco di temi), ma penso che il mio sia più modulare e possa quindi essere più accessibile a un estraneo. D'altra parte, non ho nessuna delle caratteristiche di persistenza di Kim.

Ecco il codice pertinente, tralasciando dichiarazioni di variabili e commenti sul pacchetto:

(require 'dash)

(defun multitheme--enable (theme)
  "As `enable-theme', but load the theme if necessary.
Respect `custom-safe-themes'."
  (if (custom-theme-p theme)
      (enable-theme theme)
    (load-theme theme)))

(defun multitheme-cycle ()
  "Cycle between the themes in `multitheme-base-theme-list'.
If none of these themes is currently active, instead enable the
first element of `multitheme-base-theme-list'.

Also re-enable `multitheme-overtheme' so it remains \"on top\" of
the base theme.

If a theme to be enabled is not yet defined, attempt to load it
first (using `load-theme').  Respect `custom-safe-themes'.

After all theme changes have been made, run
`multitheme-base-change-hook'."
  (interactive)
  (when (require 'validate nil :noerror)
    (validate-variable 'multitheme-base-theme-list)
    (validate-variable 'multitheme-overtheme)
    (validate-variable 'multitheme-base-theme-change-hook))
  (let ((themes (-drop-while
                 (lambda (thm) (not (custom-theme-enabled-p thm)))
                 multitheme-base-theme-list)))
    ;; Cycle base theme
    (if (null themes)
        (multitheme--enable (car multitheme-base-theme-list))
      (disable-theme (car themes))
      (multitheme--enable (or (cadr themes)
                              (car multitheme-base-theme-list))))
    ;; Reassert overtheme
    (when multitheme-overtheme
      (multitheme--enable multitheme-overtheme))
    ;; Run hooks
    (run-hooks 'multitheme-base-theme-change-hook)))

0

Ho questa configurazione per i temi del ciclismo:

(defvar quick-switch-themes
  (let ((themes-list (list 'jazz
                           ;; 'vicarie-and-blackboard
                           ;; 'tangotango
                           'poet)))
    (nconc themes-list themes-list))
  "A circular list of themes to keep switching between.
Make sure that the currently enabled theme is at the head of this
list always.

A nil value implies no custom theme should be enabled.")

(defun quick-switch-themes* ()
  "Switch between to commonly used faces in Emacs.
One for writing code and the other for reading articles."
  (interactive)
  (if-let* ((next-theme (cadr quick-switch-themes)))
      (progn (when-let* ((current-theme (car quick-switch-themes)))
               (disable-theme (car quick-switch-themes)))
             (load-theme next-theme t)
             (message "Loaded theme: %s" next-theme))
    ;; Always have the dark mode-line theme
    (mapc #'disable-theme (delq 'smart-mode-line-dark custom-enabled-themes)))
  (setq quick-switch-themes (cdr quick-switch-themes)))

0

So di essere un po 'in ritardo alla festa, ma ho creato un pacchetto per fare esattamente questo e molto altro.

Fondamentalmente ti consente di definire un elenco dei tuoi temi di colore preferiti (che è facoltativo) e di spostarti comodamente nell'elenco.

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.