core-ui: clean up + refactor modeline functions/macros

This commit is contained in:
Henrik Lissner 2017-03-04 00:28:16 -05:00
parent ab07120ea6
commit beb92b0e97

View file

@ -205,50 +205,54 @@ file."
;; Modeline ;; Modeline
;; ;;
;; TODO Improve docstrings
(defmacro def-modeline-segment! (name &rest forms) (defmacro def-modeline-segment! (name &rest forms)
"Defines a modeline segment function and byte compiles it." "Defines a modeline segment and byte compiles it."
(declare (indent defun) (doc-string 2)) (declare (indent defun) (doc-string 2))
`(defun ,(intern (format "doom-modeline-segment--%s" name)) () (let ((sym (intern (format "doom-modeline-segment--%s" name))))
,@forms)) `(progn
(defun ,sym () ,@forms)
,(unless (bound-and-true-p byte-compile-current-file)
`(let (byte-compile-warnings)
(byte-compile ',sym))))))
(defsubst doom--prepare-modeline-segments (segments) (defsubst doom--prepare-modeline-segments (segments)
(delq (let (segs)
nil (dolist (seg segments (nreverse segs))
(mapcar (lambda (seg) (push (if (stringp seg)
(if (stringp seg) seg
seg (list (intern (format "doom-modeline-segment--%s" (symbol-name seg)))))
(list (intern (format "doom-modeline-segment--%s" (symbol-name seg)))))) segs))))
segments)))
(defmacro def-modeline! (name lhs &optional rhs) (defmacro def-modeline! (name lhs &optional rhs)
"Defines a modeline format and byte-compiles it. "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
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))
(setq-default mode-line-format (doom-modeline 'minimal))" (setq-default mode-line-format (doom-modeline 'minimal))"
(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)))
(prog1 `(progn
`(progn (defun ,sym ()
(defun ,sym () (let ((lhs (list ,@lhs-forms))
(let ((lhs (list ,@lhs-forms)) (rhs (list ,@rhs-forms)))
(rhs (list ,@rhs-forms))) (list lhs
(list lhs (propertize
(propertize " " 'display
" " 'display `((space :align-to (- (+ right right-fringe right-margin)
`((space :align-to (- (+ right right-fringe right-margin) ,(+ 1 (string-width (format-mode-line rhs)))))))
,(+ 1 (string-width (format-mode-line rhs))))))) rhs)))
rhs))) ,(unless (bound-and-true-p byte-compile-current-file)
,(unless (bound-and-true-p byte-compile-current-file) `(let (byte-compile-warnings)
`(let (byte-compile-warnings) (byte-compile ',sym))))))
(byte-compile ',sym)))))))
(defun doom-modeline (key) (defun doom-modeline (key)
"TODO" "Returns a mode-line configuration associated with KEY (a symbol). Throws an
error if it doesn't exist."
(let ((fn (intern (format "doom-modeline-format--%s" key)))) (let ((fn (intern (format "doom-modeline-format--%s" key))))
(unless (functionp fn) (unless (functionp fn)
(error "Modeline format doesn't exist: %s" key)) (error "Modeline format doesn't exist: %s" key))