Đây là mô-đun tôi đã viết cho .emacs của riêng tôi để giải quyết vấn đề này. Cách tiếp cận cơ bản của tôi dường như tương tự với ý định đối với giải pháp của Maxim Kim (xoay qua danh sách các chủ đề), nhưng tôi nghĩ rằng phương pháp của tôi mang tính mô đun hơn và do đó có thể dễ tiếp cận hơn với người ngoài. Mặt khác, tôi không có bất kỳ tính năng bền bỉ nào của Kim.
Đây là mã có liên quan, bỏ các khai báo biến và bình luận gói:
(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)
trả về chủ đề hiện được kích hoạt.