|
6 | 6 | ;; Maintainer: Shen, Jen-Chieh <jcs090218@gmail.com> |
7 | 7 | ;; URL: https://github.com/jcs-emacs/jcs-modeline |
8 | 8 | ;; Version: 0.1.0 |
9 | | -;; Package-Requires: ((emacs "27.1")) |
| 9 | +;; Package-Requires: ((emacs "27.1") (moody "0.7.1")) |
10 | 10 | ;; Keywords: faces mode-line |
11 | 11 |
|
12 | 12 | ;; This file is not part of GNU Emacs. |
|
31 | 31 |
|
32 | 32 | ;;; Code: |
33 | 33 |
|
| 34 | +(require 'moody) |
| 35 | + |
34 | 36 | (defgroup jcs-modeline nil |
35 | 37 | "A modeline for jcs-emacs." |
36 | 38 | :prefix "jcs-modeline-" |
37 | 39 | :group 'faces |
38 | 40 | :link '(url-link :tag "Github" "https://github.com/jcs-emacs/jcs-modeline")) |
39 | 41 |
|
| 42 | +;; |
| 43 | +;; (@* "Entry" ) |
| 44 | +;; |
| 45 | + |
| 46 | +(defvar jcs-modeline--default-mode-line nil |
| 47 | + "Default modeline value to revert back.") |
| 48 | + |
| 49 | +(defun jcs-modeline--enable () |
| 50 | + "Enable function `jcs-modeline-mode'." |
| 51 | + (setq jcs-modeline--default-mode-line mode-line-format |
| 52 | + mode-line-format |
| 53 | + '((:eval |
| 54 | + (jcs-modeline-render |
| 55 | + (quote |
| 56 | + ("%e " |
| 57 | + mode-line-front-space |
| 58 | + mode-line-buffer-identification " " |
| 59 | + (:eval (moody-tab (concat " " (format-mode-line mode-line-modes)))) |
| 60 | + " " (:eval (jcs-modeline--vc-project)))) |
| 61 | + (quote |
| 62 | + ((:eval |
| 63 | + (when (and (bound-and-true-p flycheck-mode) |
| 64 | + (or flycheck-current-errors |
| 65 | + (eq 'running flycheck-last-status-change))) |
| 66 | + (cl-loop for state in '((error . "#FB4933") |
| 67 | + (warning . "#FABD2F") |
| 68 | + (info . "#83A598")) |
| 69 | + as lighter = (jcs-modeline--flycheck-lighter (car state)) |
| 70 | + when lighter |
| 71 | + concat (propertize lighter 'face `(:foreground ,(cdr state)))))) |
| 72 | + (:eval (jcs-modeline--vc-info)) " " |
| 73 | + (:eval (moody-tab " %l : %c " 0 'up)) " %p " |
| 74 | + mode-line-end-spaces))))))) |
| 75 | + |
| 76 | +(defun jcs-modeline--disable () |
| 77 | + "Disable function `jcs-modeline-mode'." |
| 78 | + (setq mode-line-format jcs-modeline--default-mode-line)) |
| 79 | + |
| 80 | +;;;###autoload |
| 81 | +(define-minor-mode jcs-modeline-mode |
| 82 | + "Minor mode `jcs-modeline-mode'." |
| 83 | + :global t |
| 84 | + :require 'jcs-modeline-mode |
| 85 | + :group 'jcs-modeline |
| 86 | + :lighter nil |
| 87 | + (if jcs-modeline-mode (jcs-modeline--enable) (jcs-modeline--disable))) |
| 88 | + |
| 89 | +;; |
| 90 | +;; (@* "Util" ) |
| 91 | +;; |
| 92 | + |
| 93 | +(defun jcs-modeline--light-theme-p () |
| 94 | + "Return non-nil if current theme is light theme." |
| 95 | + (ignore-errors (jcs-light-color-p (face-background 'default)))) |
| 96 | + |
| 97 | +;; |
| 98 | +;; (@* "Core" ) |
| 99 | +;; |
| 100 | + |
| 101 | +(defun jcs-modeline--adjust-pad () |
| 102 | + "Adjust padding for external packages." |
| 103 | + (let ((delta 0)) |
| 104 | + (when vertical-scroll-bar |
| 105 | + (when-let* ((data (window-scroll-bars)) |
| 106 | + (shown (nth 2 data)) |
| 107 | + (width (nth 1 data))) |
| 108 | + (setq delta (+ delta width)))) |
| 109 | + delta)) |
| 110 | + |
| 111 | +(defun jcs-modeline-render (left right) |
| 112 | + "Render mode line with LEFT and RIGHT alignment." |
| 113 | + (let* ((len-left (length (format-mode-line left))) |
| 114 | + (len-right (length (format-mode-line right))) |
| 115 | + (available-width (- (window-width) (+ len-left len-right))) |
| 116 | + (available-width (+ available-width (jcs-modeline--adjust-pad)))) |
| 117 | + (append left |
| 118 | + (list (format (format "%%%ds" available-width) "")) |
| 119 | + right))) |
| 120 | + |
| 121 | +;; |
| 122 | +;; (@* "Plugins" ) |
| 123 | +;; |
| 124 | + |
| 125 | +(defun jcs-modeline--vc-info () |
| 126 | + "Return vc-mode information." |
| 127 | + (format-mode-line '(vc-mode vc-mode))) |
| 128 | + |
| 129 | +(defun jcs-modeline--vc-project () |
| 130 | + "Return the project name." |
| 131 | + (when-let ((project (jcs-project-root))) |
| 132 | + (file-name-nondirectory (directory-file-name project)))) |
| 133 | + |
| 134 | +(defun jcs-modeline--flycheck-lighter (state) |
| 135 | + "Return flycheck information for the given error type STATE." |
| 136 | + (let* ((counts (flycheck-count-errors flycheck-current-errors)) |
| 137 | + (errorp (flycheck-has-current-errors-p state)) |
| 138 | + (err (or (cdr (assq state counts)) "?")) |
| 139 | + (running (eq 'running flycheck-last-status-change))) |
| 140 | + (if (or errorp running) (format "•%s" err)))) |
| 141 | + |
| 142 | +;; |
| 143 | +;; (@* "Themes" ) |
| 144 | +;; |
| 145 | + |
| 146 | +(defun jcs-modeline--set-color (ac-lst inac-lst) |
| 147 | + "Set `mode-line' theme faces with AC-LST and INAC-LST." |
| 148 | + (let ((state (frame-focus-state)) |
| 149 | + (ac-0 (nth 0 ac-lst)) (ac-1 (nth 1 ac-lst)) |
| 150 | + (ic-0 (nth 0 inac-lst)) (ic-1 (nth 1 inac-lst))) |
| 151 | + (set-face-foreground 'mode-line (if state ac-0 ic-0)) |
| 152 | + (set-face-background 'mode-line (if state ac-1 ic-1)) |
| 153 | + (set-face-foreground 'mode-line-inactive ic-0) |
| 154 | + (set-face-background 'mode-line-inactive ic-1))) |
| 155 | + |
| 156 | +(defun jcs-modeline--set-border-color (color) |
| 157 | + "Set the border color with COLOR." |
| 158 | + (set-face-foreground 'vertical-border color) |
| 159 | + (set-face-foreground 'window-divider color)) |
| 160 | + |
| 161 | +(defun jcs-modeline--set-theme (ml-ac-lst ml-inac-lst bc) |
| 162 | + "Set the mode line theme. |
| 163 | +ML-AC-LST : mode-line active list. ML-INAC-LST : mode-line inactive list. |
| 164 | +BC : border color." |
| 165 | + (jcs-modeline--set-color ml-ac-lst ml-inac-lst) |
| 166 | + (jcs-modeline--set-border-color bc)) |
| 167 | + |
| 168 | +(defun jcs-modeline-gray () |
| 169 | + "Gray mode line." |
| 170 | + (interactive) |
| 171 | + (if (jcs-modeline--light-theme-p) |
| 172 | + (jcs-modeline--set-theme |
| 173 | + '("#1C1C1C" "#E5E5E5") '("#000000" "#D7D7D7") "#161616") |
| 174 | + (jcs-modeline--set-theme |
| 175 | + '("#D2D2D2" "#4D4D4D") '("#CCCCCC" "#333333") "#D2D2D2"))) |
| 176 | + |
| 177 | +(defun jcs-modeline-dark-green () |
| 178 | + "Dark green mode line." |
| 179 | + (interactive) |
| 180 | + (if (jcs-modeline--light-theme-p) |
| 181 | + (jcs-modeline--set-theme |
| 182 | + '("#000" "#B7D3D3") '("#000" "#99C2C2") "#B7D3D3") |
| 183 | + (jcs-modeline--set-theme |
| 184 | + '("#CCCCCC" "#3C6A69") '("#CCCCCC" "#2B4D4D") "#3C6A69"))) |
| 185 | + |
| 186 | +(defun jcs-modeline-dark-blue () |
| 187 | + "Dark blue mode line." |
| 188 | + (interactive) |
| 189 | + (if (jcs-modeline--light-theme-p) |
| 190 | + (jcs-modeline--set-theme |
| 191 | + '("#000" "#92B9DF") '("#000" "#7AA0C6") "#92B9DF") |
| 192 | + (jcs-modeline--set-theme |
| 193 | + '("#CCCCCC" "#205386") '("#CCCCCC" "#0C3765") "#246AAF"))) |
| 194 | + |
| 195 | +(defun jcs-modeline-dark-orange () |
| 196 | + "Dark orange mode line." |
| 197 | + (interactive) |
| 198 | + (if (jcs-modeline--light-theme-p) |
| 199 | + (jcs-modeline--set-theme |
| 200 | + '("#1C1C1C" "#CC6633") '("#000000" "#682B12") "#CC6633") |
| 201 | + (jcs-modeline--set-theme |
| 202 | + '("#D2D2D2" "#CC6633") '("#CCCCCC" "#A4532A") "#CC6633"))) |
| 203 | + |
| 204 | +(defun jcs-modeline-red () |
| 205 | + "Red mode line." |
| 206 | + (interactive) |
| 207 | + (if (jcs-modeline--light-theme-p) |
| 208 | + (jcs-modeline--set-theme |
| 209 | + '("#CCCCCC" "#FF0000") '("#CCCCCC" "#6A0101") "#FF0000") |
| 210 | + (jcs-modeline--set-theme |
| 211 | + '("#CCCCCC" "#FF0000") '("#CCCCCC" "#6A0101") "#FF0000"))) |
| 212 | + |
| 213 | +(defun jcs-modeline-purple () |
| 214 | + "Purple mode line." |
| 215 | + (interactive) |
| 216 | + (if (jcs-modeline--light-theme-p) |
| 217 | + (jcs-modeline--set-theme |
| 218 | + '("#CCCCCC" "#B100EB") '("#CCCCCC" "#650286") "#B100EB") |
| 219 | + (jcs-modeline--set-theme |
| 220 | + '("#CCCCCC" "#B100EB") '("#CCCCCC" "#650286") "#B100EB"))) |
| 221 | + |
40 | 222 | (provide 'jcs-modeline) |
41 | 223 | ;;; jcs-modeline.el ends here |
0 commit comments