Emacs: Cycle Color Theme, Toggle 📜

By Xah Lee. Date: . Last updated: .

xah cycle theme

(defvar xah-cycle-theme-array
  (vector 'modus-vivendi 'deeper-blue 'adwaita 'dichromacy nil)
  "A vector of theme names for `xah-cycle-theme'. Each is a symbol or nil.
If nil, means turn off all theme.
URL `http://xahlee.info/emacs/emacs/elisp_xah-toggle-theme.html'")
(defun xah-cycle-theme ()
  "Cycle color themes.
URL `http://xahlee.info/emacs/emacs/elisp_xah-toggle-theme.html'
Created: 2025-08-06
Version: 2025-10-16"
  (interactive)
  (let* ((xstate-old
          (if (get 'xah-cycle-theme 'xstate)
              (get 'xah-cycle-theme 'xstate)
            (1- (length xah-cycle-theme-array))))
         (xstate-new (% (1+ xstate-old) (length xah-cycle-theme-array)))
         (xthemename (aref xah-cycle-theme-array xstate-new)))
    (mapc (lambda (x) (disable-theme x)) custom-enabled-themes)
    (put 'xah-cycle-theme 'xstate xstate-new)
    (if xthemename
        (progn
          (load-theme xthemename)
          (message "Color theme set to %s" xthemename)
          xthemename)
      (progn
        (message "color theme set to none")
        nil)))
  (set-transient-map
   (let ((xkmap (make-sparse-keymap)))
     (define-key xkmap (kbd (if (boundp 'xah-repeat-key) xah-repeat-key ".")) real-this-command)
     xkmap)))

Emacs, Color Theme