Erstellen Sie eine Funktion zum Umschalten von Themen

8

Wie kann ich eine interaktive Funktion zum Umschalten zwischen zwei Farbthemen erstellen?

Nach dem, was ich feststellen konnte, gibt es keine Variable, die auf das aktuell verwendete Farbthema festgelegt ist. Tatsächlich können mehrere gleichzeitig geladen werden.

Zum Umschalten müssen Sie zunächst disable-themedas aktuell geladene Thema auswählen, damit die Themen nicht in Konflikt geraten.

Wie geht das, ohne zu wissen, welches Thema gerade geladen ist?

Jborg
quelle
2
(car custom-enabled-themes)Gibt das aktuell aktivierte Thema zurück.
Mutbuerger
Mögliches Duplikat von Wie wird das Farbthema zurückgesetzt?
Mutbuerger
Verwenden Sie einfach das Counsel-Load-Thema, wenn Sie Counsel verwenden.
InHarmsWay

Antworten:

4

Ich habe es geschafft, aber ich wechsle 3 Themen (Mein eigener Kosmos, Leuven und Standard)

Sie können https://github.com/habamax/.emacs.d/blob/master/lisp/haba-appearance.el überprüfen

Auszug daraus:

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

Binden Sie dann einen Schlüssel an das Haba / Toggle-Thema.

Ich verwende Emacs auf 2 verschiedenen Computern und Umgebungen (Tag, später Abend), sodass das aktuelle Thema beim Beenden / Laden von Emacs gespeichert / wiederhergestellt werden kann. Welches ist praktisch :)

Maxim Kim
quelle
5

Ich habe einige Funktionen geschrieben, um durch eine Gruppe von Themen zu blättern.

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

Ich rufe ivan/load-indexed-thememeine Init-Datei auf, um mein Thema zu initialisieren.

Ich binde ivan/cycle-themean Space\im Bösen Modus. ( SpaceIst mein Anführerschlüssel.)

ivan
quelle
2

Obwohl die vorhandenen Antworten gut funktionieren, möchte ich eine einfachere teilen:

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

Dadurch wird das benutzerdefinierte Standardthema nicht zuerst deaktiviert, aber das gefällt mir.

Michel de Ruiter
quelle
1

Dies ist das Modul, das ich für meine eigenen .emacs geschrieben habe, um dieses Problem zu lösen. Mein grundlegender Ansatz scheint in der Absicht der Lösung von Maxim Kim (Rotation durch eine Liste von Themen) ähnlich zu sein, aber ich denke, meine ist modularer und daher für einen Außenstehenden möglicherweise zugänglicher. Auf der anderen Seite habe ich keine von Kims Persistenzmerkmalen.

Hier ist der relevante Code, bei dem Variablendeklarationen und Paketkommentare weggelassen werden:

(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)))
Aaron Harris
quelle
0

Ich habe dieses Setup für Fahrradthemen:

(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)))
narendraj9
quelle
0

Ich weiß, dass ich etwas spät zur Party komme, aber ich habe ein Paket erstellt , um genau das zu tun, und vieles mehr.

Grundsätzlich können Sie eine Liste Ihrer bevorzugten Farbthemen definieren (was optional ist) und bequem durch die Liste navigieren.

myTerminal
quelle