Refactor :ui modeline +light

This commit is contained in:
Henrik Lissner 2020-05-25 02:23:37 -04:00
parent e00bfc7612
commit 0252f4f36f
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -50,17 +50,17 @@ side of the modeline, and whose CDR is the right-hand side.")
;; ;;
;;; Faces ;;; Faces
(defface +modeline-bar-active '((t (:inherit highlight))) (defface doom-modeline-bar '((t (:inherit highlight)))
"Face used for left-most bar on the mode-line of an active window.") "Face used for left-most bar on the mode-line of an active window.")
(defface +modeline-bar-inactive '((t (:inherit mode-line-inactive))) (defface doom-modeline-bar-inactive '((t (:inherit mode-line-inactive)))
"Face used for left-most bar on the mode-line of an inactive window.") "Face used for left-most bar on the mode-line of an inactive window.")
(defface +modeline-highlight (defface doom-modeline-highlight
'((t (:inherit mode-line-highlight))) '((t (:inherit mode-line-highlight)))
"Face used for highlighted modeline panels (like search counts).") "Face used for highlighted modeline panels (like search counts).")
(defface +modeline-alternate-highlight (defface doom-modeline-alternate-highlight
'((t (:inherit mode-line-highlight))) '((t (:inherit mode-line-highlight)))
"Alternative face used for highlighted modeline panels (like search counts).") "Alternative face used for highlighted modeline panels (like search counts).")
@ -175,172 +175,177 @@ LHS and RHS will accept."
;;; `+modeline-bar' ;;; `+modeline-bar'
(progn (def-modeline-var! +modeline-bar "")
(def-modeline-var! +modeline-bar "")
(def-modeline-var! +modeline-inactive-bar "")
(add-hook! '(doom-init-ui-hook doom-load-theme-hook) :append (defvar +modeline-active-bar "")
(defun +modeline-refresh-bars-h () (defvar +modeline-inactive-bar "")
(let ((width (or +modeline-bar-width 1))
(height (max +modeline-height 0)))
(setq +modeline-bar
(+modeline--make-xpm
(and +modeline-bar-width
(face-background '+modeline-bar-active nil t))
width height)
+modeline-inactive-bar
(+modeline--make-xpm
(and +modeline-bar-width
(face-background '+modeline-bar-inactive nil t))
width height)))))
(add-hook! 'doom-change-font-size-hook (add-hook! '(doom-init-ui-hook doom-load-theme-hook) :append
(defun +modeline-adjust-height-h () (defun +modeline-refresh-bars-h ()
(defvar +modeline--old-height +modeline-height) (let ((width (or +modeline-bar-width 1))
(let ((default-height +modeline--old-height) (height (max +modeline-height 0))
(scale (or (frame-parameter nil 'font-scale) 0))) (active-bg (face-background 'doom-modeline-bar nil t))
(setq +modeline-height (inactive-bg (face-background 'doom-modeline-bar-inactive nil t)))
(if (> scale 0) (when (or (null +modeline-bar-width)
(+ default-height (* (or (frame-parameter nil 'font-scale) 1) (= +modeline-bar-width 0))
doom-font-increment)) (setq active-bg nil
default-height)) inactive-bg nil))
(when doom-init-time (setq +modeline-active-bar
(+modeline-refresh-bars-h)))))) (+modeline--make-xpm (and +modeline-bar-width active-bg)
width height)
+modeline-inactive-bar
(+modeline--make-xpm (and +modeline-bar-width inactive-bg)
width height)
+modeline-bar
'(:eval (if (+modeline-active)
+modeline-active-bar
+modeline-inactive-bar))))))
(add-hook! 'doom-change-font-size-hook
(defun +modeline-adjust-height-h ()
(defvar +modeline--old-height +modeline-height)
(let ((default-height +modeline--old-height)
(scale (or (frame-parameter nil 'font-scale) 0)))
(setq +modeline-height
(if (> scale 0)
(+ default-height (* (or (frame-parameter nil 'font-scale) 1)
doom-font-increment))
default-height))
(when doom-init-time
(+modeline-refresh-bars-h)))))
;;; `+modeline-matches' ;;; `+modeline-matches'
(progn (use-package! anzu
(use-package! anzu :after-call isearch-mode
:after-call isearch-mode :config
:config ;; We manage our own modeline segments
;; We manage our own modeline segments (setq anzu-cons-mode-line-p nil)
(setq anzu-cons-mode-line-p nil) ;; Ensure anzu state is cleared when searches & iedit are done
;; Ensure anzu state is cleared when searches & iedit are done (add-hook 'iedit-mode-end-hook #'anzu--reset-status)
(add-hook 'iedit-mode-end-hook #'anzu--reset-status) (advice-add #'evil-force-normal-state :before #'anzu--reset-status)
(advice-add #'evil-force-normal-state :before #'anzu--reset-status) ;; Fix matches segment mirroring across all buffers
;; Fix matches segment mirroring across all buffers (mapc #'make-variable-buffer-local
(mapc #'make-variable-buffer-local '(anzu--total-matched
'(anzu--total-matched anzu--current-position
anzu--current-position anzu--state
anzu--state anzu--cached-count
anzu--cached-count anzu--cached-positions anzu--last-command
anzu--cached-positions anzu--last-command anzu--last-isearch-string anzu--overflow-p))
anzu--last-isearch-string anzu--overflow-p)) (global-anzu-mode +1))
(anzu-mode +1)) (use-package! evil-anzu
:when (featurep! :editor evil)
:after-call evil-ex-start-search evil-ex-start-word-search evil-ex-search-activate-highlight)
(use-package! evil-anzu (defun +modeline--anzu ()
:when (featurep! :editor evil) "Show the match index and total number thereof.
:after-call evil-ex-start-search evil-ex-start-word-search evil-ex-search-activate-highlight)
(defun +modeline--anzu ()
"Show the match index and total number thereof.
Requires `anzu', also `evil-anzu' if using `evil-mode' for compatibility with Requires `anzu', also `evil-anzu' if using `evil-mode' for compatibility with
`evil-search'." `evil-search'."
(when (and (bound-and-true-p anzu--state) (when (and (bound-and-true-p anzu--state)
(not (bound-and-true-p iedit-mode))) (not (bound-and-true-p iedit-mode)))
(propertize (propertize
(let ((here anzu--current-position) (let ((here anzu--current-position)
(total anzu--total-matched)) (total anzu--total-matched))
(cond ((eq anzu--state 'replace-query) (cond ((eq anzu--state 'replace-query)
(format " %d replace " anzu--cached-count)) (format " %d replace " anzu--cached-count))
((eq anzu--state 'replace) ((eq anzu--state 'replace)
(format " %d/%d " (1+ here) total)) (format " %d/%d " (1+ here) total))
(anzu--overflow-p (anzu--overflow-p
(format " %s+ " total)) (format " %s+ " total))
(t (t
(format " %s/%d " here total)))) (format " %s/%d " here total))))
'face (if (+modeline-active) '+modeline-highlight)))) 'face (if (+modeline-active) 'doom-modeline-highlight))))
(defun +modeline--evil-substitute () (defun +modeline--evil-substitute ()
"Show number of matches for evil-ex substitutions and highlights in real time." "Show number of matches for evil-ex substitutions and highlights in real time."
(when (and (bound-and-true-p evil-local-mode) (when (and (bound-and-true-p evil-local-mode)
(or (assq 'evil-ex-substitute evil-ex-active-highlights-alist) (or (assq 'evil-ex-substitute evil-ex-active-highlights-alist)
(assq 'evil-ex-global-match evil-ex-active-highlights-alist) (assq 'evil-ex-global-match evil-ex-active-highlights-alist)
(assq 'evil-ex-buffer-match evil-ex-active-highlights-alist))) (assq 'evil-ex-buffer-match evil-ex-active-highlights-alist)))
(propertize (propertize
(let ((range (if evil-ex-range (let ((range (if evil-ex-range
(cons (car evil-ex-range) (cadr evil-ex-range)) (cons (car evil-ex-range) (cadr evil-ex-range))
(cons (line-beginning-position) (line-end-position)))) (cons (line-beginning-position) (line-end-position))))
(pattern (car-safe (evil-delimited-arguments evil-ex-argument 2)))) (pattern (car-safe (evil-delimited-arguments evil-ex-argument 2))))
(if pattern (if pattern
(format " %s matches " (how-many pattern (car range) (cdr range))) (format " %s matches " (how-many pattern (car range) (cdr range)))
" - ")) " - "))
'face (if (+modeline-active) '+modeline-highlight)))) 'face (if (+modeline-active) 'doom-modeline-highlight))))
(defun +modeline--multiple-cursors () (defun +modeline--multiple-cursors ()
"Show the number of multiple cursors." "Show the number of multiple cursors."
(when (bound-and-true-p evil-mc-cursor-list) (when (bound-and-true-p evil-mc-cursor-list)
(let ((count (length evil-mc-cursor-list))) (let ((count (length evil-mc-cursor-list)))
(when (> count 0) (when (> count 0)
(let ((face (cond ((not (+modeline-active)) 'mode-line-inactive) (let ((face (cond ((not (+modeline-active)) 'mode-line-inactive)
(evil-mc-frozen '+modeline-highlight) (evil-mc-frozen 'doom-modeline-highlight)
('+modeline-alternate-highlight)))) ('doom-modeline-alternate-highlight))))
(concat (propertize " " 'face face) (concat (propertize " " 'face face)
(all-the-icons-faicon "i-cursor" :face face :v-adjust -0.0575) (all-the-icons-faicon "i-cursor" :face face :v-adjust -0.0575)
(propertize " " 'face `(:inherit (variable-pitch ,face))) (propertize " " 'face `(:inherit (variable-pitch ,face)))
(propertize (format "%d " count) (propertize (format "%d " count)
'face face))))))) 'face face)))))))
(defun +modeline--overlay< (a b) (defun +modeline--overlay< (a b)
"Sort overlay A and B." "Sort overlay A and B."
(< (overlay-start a) (overlay-start b))) (< (overlay-start a) (overlay-start b)))
(defun +modeline--iedit () (defun +modeline--iedit ()
"Show the number of iedit regions matches + what match you're on." "Show the number of iedit regions matches + what match you're on."
(when (and (bound-and-true-p iedit-mode) (when (and (bound-and-true-p iedit-mode)
(bound-and-true-p iedit-occurrences-overlays)) (bound-and-true-p iedit-occurrences-overlays))
(propertize (propertize
(let ((this-oc (or (let ((inhibit-message t)) (let ((this-oc (or (let ((inhibit-message t))
(iedit-find-current-occurrence-overlay)) (iedit-find-current-occurrence-overlay))
(save-excursion (save-excursion
(iedit-prev-occurrence) (iedit-prev-occurrence)
(iedit-find-current-occurrence-overlay)))) (iedit-find-current-occurrence-overlay))))
(length (length iedit-occurrences-overlays))) (length (length iedit-occurrences-overlays)))
(format " %s/%d " (format " %s/%d "
(if this-oc (if this-oc
(- length (- length
(length (memq this-oc (sort (append iedit-occurrences-overlays nil) (length (memq this-oc (sort (append iedit-occurrences-overlays nil)
#'+modeline--overlay<))) #'+modeline--overlay<)))
-1) -1)
"-") "-")
length)) length))
'face (if (+modeline-active) '+modeline-highlight)))) 'face (if (+modeline-active) 'doom-modeline-highlight))))
(defun +modeline--macro-recording () (defun +modeline--macro-recording ()
"Display current Emacs or evil macro being recorded." "Display current Emacs or evil macro being recorded."
(when (and (+modeline-active) (when (and (+modeline-active)
(or defining-kbd-macro (or defining-kbd-macro
executing-kbd-macro)) executing-kbd-macro))
(let ((sep (propertize " " 'face '+modeline-highlight))) (let ((sep (propertize " " 'face 'doom-modeline-highlight)))
(concat sep (concat sep
(propertize (if (bound-and-true-p evil-this-macro) (propertize (if (bound-and-true-p evil-this-macro)
(char-to-string evil-this-macro) (char-to-string evil-this-macro)
"Macro") "Macro")
'face '+modeline-highlight) 'face 'doom-modeline-highlight)
sep sep
(all-the-icons-octicon "triangle-right" (all-the-icons-octicon "triangle-right"
:face '+modeline-highlight :face 'doom-modeline-highlight
:v-adjust -0.05) :v-adjust -0.05)
sep)))) sep))))
(def-modeline-var! +modeline-matches (def-modeline-var! +modeline-matches
'(:eval '(:eval
(let ((meta (concat (+modeline--macro-recording) (let ((meta (concat (+modeline--macro-recording)
(+modeline--anzu) (+modeline--anzu)
(+modeline--evil-substitute) (+modeline--evil-substitute)
(+modeline--iedit) (+modeline--iedit)
(+modeline--multiple-cursors)))) (+modeline--multiple-cursors))))
(or (and (not (equal meta "")) meta) (or (and (not (equal meta "")) meta)
" %I "))))) " %I "))))
;;; `+modeline-modes' ;;; `+modeline-modes'
(def-modeline-var! +modeline-modes ; remove minor modes (def-modeline-var! +modeline-modes ; remove minor modes
'("" '(""
(:propertize mode-name (:propertize mode-name
face bold face bold
mouse-face +modeline-highlight) mouse-face doom-modeline-highlight)
mode-line-process mode-line-process
"%n" "%n"
" ")) " "))
@ -369,88 +374,86 @@ Requires `anzu', also `evil-anzu' if using `evil-mode' for compatibility with
;;; `+modeline-checker' ;;; `+modeline-checker'
(progn (def-modeline-var! +modeline-checker nil
(def-modeline-var! +modeline-checker nil "Displays color-coded error status & icon for the current buffer."
"Displays color-coded error status & icon for the current buffer." :local t)
:local t)
(add-hook! '(flycheck-status-changed-functions (add-hook! '(flycheck-status-changed-functions
flycheck-mode-hook) flycheck-mode-hook)
(defun +modeline-checker-update (&optional status) (defun +modeline-checker-update (&optional status)
"Update flycheck text via STATUS." "Update flycheck text via STATUS."
(setq +modeline-checker (setq +modeline-checker
(pcase status (pcase status
(`finished (`finished
(if flycheck-current-errors (if flycheck-current-errors
(let-alist (flycheck-count-errors flycheck-current-errors) (let-alist (flycheck-count-errors flycheck-current-errors)
(let ((error (or .error 0)) (let ((error (or .error 0))
(warning (or .warning 0)) (warning (or .warning 0))
(info (or .info 0))) (info (or .info 0)))
(+modeline-format-icon "do_not_disturb_alt" (+modeline-format-icon "do_not_disturb_alt"
(number-to-string (+ error warning info)) (number-to-string (+ error warning info))
(cond ((> error 0) 'error) (cond ((> error 0) 'error)
((> warning 0) 'warning) ((> warning 0) 'warning)
('success)) ('success))
(format "Errors: %d, Warnings: %d, Debug: %d" (format "Errors: %d, Warnings: %d, Debug: %d"
error error
warning warning
info)))) info))))
(+modeline-format-icon "check" "" 'success))) (+modeline-format-icon "check" "" 'success)))
(`running (+modeline-format-icon "access_time" "*" 'font-lock-comment-face "Running...")) (`running (+modeline-format-icon "access_time" "*" 'font-lock-comment-face "Running..."))
(`errored (+modeline-format-icon "sim_card_alert" "!" 'error "Errored!")) (`errored (+modeline-format-icon "sim_card_alert" "!" 'error "Errored!"))
(`interrupted (+modeline-format-icon "pause" "!" 'font-lock-comment-face "Interrupted")) (`interrupted (+modeline-format-icon "pause" "!" 'font-lock-comment-face "Interrupted"))
(`suspicious (+modeline-format-icon "priority_high" "!" 'error "Suspicious"))))))) (`suspicious (+modeline-format-icon "priority_high" "!" 'error "Suspicious"))))))
;;; `+modeline-selection-info' ;;; `+modeline-selection-info'
(progn (defsubst +modeline--column (pos)
(defsubst +modeline--column (pos) "Get the column of the position `POS'."
"Get the column of the position `POS'." (save-excursion (goto-char pos)
(save-excursion (goto-char pos) (current-column)))
(current-column)))
(def-modeline-var! +modeline-selection-info (def-modeline-var! +modeline-selection-info
'(:eval '(:eval
(when (or mark-active (when (or (and (bound-and-true-p evil-local-mode)
(and (bound-and-true-p evil-local-mode) (eq evil-state 'visual))
(eq evil-state 'visual))) mark-active)
(cl-destructuring-bind (beg . end) (cl-destructuring-bind (beg . end)
(if (boundp 'evil-local-mode) (if (bound-and-true-p evil-visual-selection)
(cons evil-visual-beginning evil-visual-end) (cons evil-visual-beginning evil-visual-end)
(cons (region-beginning) (region-end))) (cons (region-beginning) (region-end)))
(propertize (propertize
(let ((lines (count-lines beg (min end (point-max))))) (let ((lines (count-lines beg (min end (point-max)))))
(concat " " (concat " "
(cond ((or (bound-and-true-p rectangle-mark-mode) (cond ((or (bound-and-true-p rectangle-mark-mode)
(and (bound-and-true-p evil-visual-selection) (and (bound-and-true-p evil-visual-selection)
(eq 'block evil-visual-selection))) (eq 'block evil-visual-selection)))
(let ((cols (abs (- (+modeline--column end) (let ((cols (abs (- (+modeline--column end)
(+modeline--column beg))))) (+modeline--column beg)))))
(format "%dx%dB" lines cols))) (format "%dx%dB" lines cols)))
((and (bound-and-true-p evil-visual-selection) ((and (bound-and-true-p evil-visual-selection)
(eq evil-visual-selection 'line)) (eq evil-visual-selection 'line))
(format "%dL" lines)) (format "%dL" lines))
((> lines 1) ((> lines 1)
(format "%dC %dL" (- end beg) lines)) (format "%dC %dL" (- end beg) lines))
((format "%dC" (- end beg)))) ((format "%dC" (- end beg))))
(when (derived-mode-p 'text-mode) (when (derived-mode-p 'text-mode)
(format " %dW" (count-words beg end))) (format " %dW" (count-words beg end)))
" ")) " "))
'face (if (+modeline-active) 'success))))) 'face (if (+modeline-active) 'success)))))
"Information about the current selection, such as how many characters and "Information about the current selection, such as how many characters and
lines are selected, or the NxM dimensions of a block selection.") lines are selected, or the NxM dimensions of a block selection.")
(defun +modeline-add-selection-segment-h () (defun +modeline-add-selection-segment-h ()
(add-to-list '+modeline-format-left '+modeline-selection-info 'append)) (add-to-list '+modeline-format-left '+modeline-selection-info 'append))
(defun +modeline-remove-selection-segment-h () (defun +modeline-remove-selection-segment-h ()
(delq! '+modeline-selection-info +modeline-format-left)) (delq! '+modeline-selection-info +modeline-format-left))
(if (featurep 'evil) (if (featurep 'evil)
(progn (progn
(add-hook 'evil-visual-state-entry-hook #'+modeline-add-selection-segment-h) (add-hook 'evil-visual-state-entry-hook #'+modeline-add-selection-segment-h)
(add-hook 'evil-visual-state-exit-hook #'+modeline-remove-selection-segment-h)) (add-hook 'evil-visual-state-exit-hook #'+modeline-remove-selection-segment-h))
(add-hook 'activate-mark-hook #'+modeline-add-selection-segment-h) (add-hook 'activate-mark-hook #'+modeline-add-selection-segment-h)
(add-hook 'deactivate-mark-hook #'+modeline-remove-selection-segment-h))) (add-hook 'deactivate-mark-hook #'+modeline-remove-selection-segment-h))
;;; `+modeline-encoding' ;;; `+modeline-encoding'
@ -496,8 +499,8 @@ lines are selected, or the NxM dimensions of a block selection.")
,(all-the-icons-octicon ,(all-the-icons-octicon
"file-directory" "file-directory"
:face 'bold :face 'bold
:v-adjust -0.05 :v-adjust -0.06
:height 1.25) :height 1.1)
(:propertize (" " (:eval (abbreviate-file-name default-directory))) (:propertize (" " (:eval (abbreviate-file-name default-directory)))
face bold)) face bold))
'("" mode-line-misc-info +modeline-modes)) '("" mode-line-misc-info +modeline-modes))
@ -507,7 +510,8 @@ lines are selected, or the NxM dimensions of a block selection.")
" " +modeline-buffer-identification) " " +modeline-buffer-identification)
'("" +modeline-modes)) '("" +modeline-modes))
;; TODO (def-modeline! pdf ...) ;; (def-modeline! pdf
;; '("" +modeline-matches))
;; TODO (def-modeline! helm ...) ;; TODO (def-modeline! helm ...)