Este é o módulo que escrevi para o meu .emacs para resolver esse problema. Minha abordagem básica parece ser semelhante na intenção da solução de Maxim Kim (alternando entre uma lista de temas), mas acho que a minha é mais modular e, portanto, pode ser mais acessível a quem está de fora. Por outro lado, não tenho nenhum dos recursos de persistência de Kim.
Aqui está o código relevante, excluindo declarações de variáveis e comentários de pacotes:
(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)))
(car custom-enabled-themes)
retorna o tema atualmente ativado.