Convert old def-modeline! from macro to function

This makes it easier to use dynamically, and ensures that
doom--prepare-modeline-segemnts isn't run prematurely (at macro
expansion time).
This commit is contained in:
Henrik Lissner 2018-07-25 15:47:18 +02:00
parent df233eb1a9
commit 593666933d
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -143,57 +143,54 @@ Also see `doom-exit-buffer-hook'.")
`(let (byte-compile-warnings) `(let (byte-compile-warnings)
(byte-compile #',sym)))))))) (byte-compile #',sym))))))))
(defsubst doom--prepare-modeline-segments (segments) (defun doom--prepare-modeline-segments (segments)
(let (forms it) (let (forms it)
(dolist (seg segments) (dolist (seg segments)
(cond ((stringp seg) (cond ((stringp seg)
(push seg forms)) (push seg forms))
((symbolp seg) ((symbolp seg)
(cond ((setq it (cdr (assq seg doom--modeline-fn-alist))) (cond ((setq it (cdr (assq seg doom--modeline-fn-alist)))
(push (list it) forms)) (push (list :eval (list it)) forms))
((setq it (cdr (assq seg doom--modeline-var-alist))) ((setq it (cdr (assq seg doom--modeline-var-alist)))
(push it forms)) (push it forms))
((error "%s is not a defined segment" seg)))) ((error "%s is not a defined segment" seg))))
((error "%s is not a valid segment" seg)))) ((error "%s is not a valid segment" seg))))
(nreverse forms))) (nreverse forms)))
(defmacro def-modeline! (name lhs &optional rhs) (defun def-modeline! (name lhs &optional rhs)
"Defines a modeline format and byte-compiles it. NAME is a symbol to identify "Defines a modeline format and byte-compiles it. NAME is a symbol to identify
it (used by `doom-modeline' for retrieval). LHS and RHS are lists of symbols of it (used by `doom-modeline' for retrieval). LHS and RHS are lists of symbols of
modeline segments defined with `def-modeline-segment!'. modeline segments defined with `def-modeline-segment!'.
Example: Example:
(def-modeline! minimal (def-modeline! 'minimal
(bar matches \" \" buffer-info) '(bar matches \" \" buffer-info)
(media-info major-mode)) '(media-info major-mode))
(doom-set-modeline 'minimal t)" (doom-set-modeline 'minimal t)"
(let ((sym (intern (format "doom-modeline-format--%s" name))) (let ((sym (intern (format "doom-modeline-format--%s" name)))
(lhs-forms (doom--prepare-modeline-segments lhs)) (lhs-forms (doom--prepare-modeline-segments lhs))
(rhs-forms (doom--prepare-modeline-segments rhs))) (rhs-forms (doom--prepare-modeline-segments rhs)))
`(progn (defalias sym
(fset ',sym (lambda ()
(lambda () (let ((rhs-str (format-mode-line rhs-forms)))
,(concat "Modeline:\n" (list lhs-forms
(format " %s\n %s" (propertize
(prin1-to-string lhs) " " 'display
(prin1-to-string rhs))) `((space :align-to (- (+ right right-fringe right-margin)
(let ((lhs (list ,@lhs-forms)) ,(+ 1 (string-width rhs-str))))))
(rhs (list ,@rhs-forms))) rhs-str)))
(let ((rhs-str (format-mode-line rhs))) (concat "Modeline:\n"
(list lhs (format " %s\n %s"
(propertize (prin1-to-string lhs)
" " 'display (prin1-to-string rhs))))
`((space :align-to (- (+ right right-fringe right-margin) (unless (bound-and-true-p byte-compile-current-file)
,(+ 1 (string-width rhs-str)))))) (let (byte-compile-warnings)
rhs-str))))) (byte-compile sym)))))
,(unless (bound-and-true-p byte-compile-current-file)
`(let (byte-compile-warnings)
(byte-compile #',sym))))))
(defun doom-modeline (key) (defun doom-modeline (key)
"Returns a mode-line configuration associated with KEY (a symbol). Throws an "Returns a mode-line configuration associated with KEY (a symbol). Throws an
error if it doesn't exist." error if it doesn't exist."
(let ((fn (intern (format "doom-modeline-format--%s" key)))) (let ((fn (intern-soft (format "doom-modeline-format--%s" key))))
(when (functionp fn) (when (functionp fn)
`(:eval (,fn))))) `(:eval (,fn)))))