Trying to get 'doom to behave like 'user is too much trouble and causes too many problems. The magic around 'user is too deeply woven into custom.el. The whole custom.el fiasco needs to be dealt with another way. Fixes #5000 Fixes #5009
66 lines
2.5 KiB
EmacsLisp
66 lines
2.5 KiB
EmacsLisp
;;; core/autoload/themes.el -*- lexical-binding: t; -*-
|
|
|
|
;;;###autoload
|
|
(defconst doom-customize-theme-hook nil)
|
|
|
|
(add-hook! 'doom-load-theme-hook
|
|
(defun doom-apply-customized-faces-h ()
|
|
"Run `doom-customize-theme-hook'."
|
|
(run-hooks 'doom-customize-theme-hook)))
|
|
|
|
(defun doom--custom-theme-set-face (spec)
|
|
(cond ((listp (car spec))
|
|
(cl-loop for face in (car spec)
|
|
collect
|
|
(car (doom--custom-theme-set-face (cons face (cdr spec))))))
|
|
((keywordp (cadr spec))
|
|
`((,(car spec) ((t ,(cdr spec))))))
|
|
(`((,(car spec) ,(cdr spec))))))
|
|
|
|
;;;###autoload
|
|
(defmacro custom-theme-set-faces! (theme &rest specs)
|
|
"Apply a list of face SPECS as user customizations for THEME.
|
|
|
|
THEME can be a single symbol or list thereof. If nil, apply these settings to
|
|
all themes. It will apply to all themes once they are loaded."
|
|
(declare (indent defun))
|
|
(let ((fn (gensym "doom--customize-themes-h-")))
|
|
`(progn
|
|
(defun ,fn ()
|
|
(let (custom--inhibit-theme-enable)
|
|
(dolist (theme (doom-enlist (or ,theme 'user)))
|
|
(when (or (eq theme 'user)
|
|
(custom-theme-enabled-p theme))
|
|
(apply #'custom-theme-set-faces theme
|
|
(mapcan #'doom--custom-theme-set-face
|
|
(list ,@specs)))))))
|
|
;; Apply the changes immediately if the user is using the default theme
|
|
;; or the theme has already loaded. This allows you to evaluate these
|
|
;; macros on the fly and customize your faces iteratively.
|
|
(when (or (get 'doom-theme 'previous-themes)
|
|
(null doom-theme))
|
|
(funcall #',fn))
|
|
;; TODO Append to `doom-load-theme-hook' with DEPTH instead when Emacs
|
|
;; 26.x support is dropped.
|
|
(add-hook 'doom-customize-theme-hook #',fn 'append))))
|
|
|
|
;;;###autoload
|
|
(defmacro custom-set-faces! (&rest specs)
|
|
"Apply a list of face SPECS as user customizations.
|
|
|
|
This is a convenience macro alternative to `custom-set-face' which allows for a
|
|
simplified face format, and takes care of load order issues, so you can use
|
|
doom-themes' API without worry."
|
|
(declare (indent defun))
|
|
`(custom-theme-set-faces! 'user ,@specs))
|
|
|
|
;;;###autoload
|
|
(defun doom/reload-theme ()
|
|
"Reload the current color theme."
|
|
(interactive)
|
|
(let ((themes (copy-sequence custom-enabled-themes)))
|
|
(load-theme doom-theme t)
|
|
(doom/reload-font)
|
|
(message "%s %s"
|
|
(propertize "Reloaded themes:" 'face 'bold)
|
|
(mapconcat #'prin1-to-string themes ", "))))
|