|
31 | 31 |
|
32 | 32 | ;;; Code: |
33 | 33 |
|
| 34 | +(require 'cl-lib) |
| 35 | +(require 'subr-x) |
| 36 | + |
34 | 37 | (require 'moody) |
35 | 38 | (require 'minions) |
36 | 39 | (require 'elenv) |
|
52 | 55 | :group 'jcs-modeline) |
53 | 56 |
|
54 | 57 | (defcustom jcs-modeline-right |
55 | | - `((:eval (jcs-modeline--render-flycheck)) |
56 | | - (:eval (jcs-modeline--render-nov)) |
57 | | - (:eval (jcs-modeline--render-vc-info)) |
| 58 | + `((:eval (jcs-modeline--render-nov)) |
58 | 59 | (:eval (jcs-modeline--render-text-scale)) |
| 60 | + (:eval (jcs-modeline--render-flymake)) |
| 61 | + (:eval (jcs-modeline--render-flycheck)) |
| 62 | + (:eval (jcs-modeline--render-vc-info)) |
59 | 63 | (:eval (moody-tab " %l : %c " 0 'up)) " %p" |
60 | 64 | mode-line-end-spaces) |
61 | 65 | "List of item to render on the right." |
|
69 | 73 | (declare-function string-pixel-width "subr-x.el") ; TODO: remove this after 29.1 |
70 | 74 | (declare-function shr-string-pixel-width "shr.el") ; TODO: remove this after 29.1 |
71 | 75 |
|
| 76 | +(defvar flymake--state) |
| 77 | +(declare-function flymake-running-backends "ext:flymake.el") |
| 78 | +(declare-function flymake-disabled-backends "ext:flymake.el") |
| 79 | +(declare-function flymake-reporting-backends "ext:flymake.el") |
| 80 | +(declare-function flymake--diag-type "ext:flymake.el") |
| 81 | +(declare-function flymake--state-diags "ext:flymake.el") |
| 82 | + |
72 | 83 | (defvar flycheck-current-errors) |
73 | 84 | (defvar flycheck-last-status-change) |
74 | 85 | (declare-function flycheck-has-current-errors-p "ext:flycheck.el") |
|
148 | 159 |
|
149 | 160 | (defun jcs-modeline--window-resize (&rest _) |
150 | 161 | "Window resize hook." |
151 | | - (let ((count 0) (index 0) (current-width 0) |
| 162 | + (let ((count 0) (current-width 0) |
| 163 | + (is-left t) |
| 164 | + (left-index 0) (right-index 0) |
152 | 165 | ;; Let's iterate it from outer to inner, so we must flip the right list. |
153 | 166 | (right-list (reverse jcs-modeline-right))) |
154 | 167 | (setq jcs-modeline--render-left nil |
155 | 168 | jcs-modeline--render-right nil) ; reset |
156 | 169 | (while (< count (length (append jcs-modeline-left jcs-modeline-right))) |
157 | | - (let* ((odd (= (% count 2) 0)) |
158 | | - (item (nth index (if odd jcs-modeline-left right-list))) |
| 170 | + (when (or (and is-left (<= (length jcs-modeline-left) left-index)) |
| 171 | + (and (not is-left) (<= (length jcs-modeline-right) right-index))) |
| 172 | + (setq is-left (not is-left))) |
| 173 | + (let* ((item (nth (if is-left left-index right-index) |
| 174 | + (if is-left jcs-modeline-left right-list))) |
159 | 175 | (format (format-mode-line item)) |
160 | 176 | (width (jcs-modeline--str-len format)) |
161 | 177 | (new-width (+ current-width width))) |
162 | 178 | (when (<= new-width (window-width)) |
163 | 179 | (setq current-width new-width) |
164 | | - (push item (if odd jcs-modeline--render-left |
| 180 | + (push item (if is-left jcs-modeline--render-left |
165 | 181 | jcs-modeline--render-right)))) |
166 | | - (setq count (1+ count) |
167 | | - index (/ count 2)))) |
| 182 | + (cl-incf (if is-left left-index right-index)) |
| 183 | + (cl-incf count) |
| 184 | + (setq is-left (not is-left)))) |
168 | 185 | (setq jcs-modeline--render-left (reverse jcs-modeline--render-left) |
169 | 186 | ;; Since we iterate it from the edge, we don't need to reverse the right |
170 | 187 | jcs-modeline--render-right jcs-modeline--render-right)) |
|
239 | 256 | "(%-d) ") |
240 | 257 | text-scale-mode-amount))) |
241 | 258 |
|
| 259 | +;; |
| 260 | +;;; Flymake |
| 261 | + |
| 262 | +(defun jcs-modeline--render-flymake () |
| 263 | + "Render for flymake." |
| 264 | + (when (bound-and-true-p flymake-mode) |
| 265 | + (let* ((known (hash-table-keys flymake--state)) |
| 266 | + (running (flymake-running-backends)) |
| 267 | + (disabled (flymake-disabled-backends)) |
| 268 | + (reported (flymake-reporting-backends)) |
| 269 | + (diags-by-type (make-hash-table)) |
| 270 | + (all-disabled (and disabled (null running))) |
| 271 | + (some-waiting (cl-set-difference running reported))) |
| 272 | + (maphash (lambda (_b state) |
| 273 | + (mapc (lambda (diag) |
| 274 | + (push diag |
| 275 | + (gethash (flymake--diag-type diag) |
| 276 | + diags-by-type))) |
| 277 | + (flymake--state-diags state))) |
| 278 | + flymake--state) |
| 279 | + (concat |
| 280 | + (cond |
| 281 | + (some-waiting (propertize "⏳" 'face `(:foreground "#FABD2F"))) |
| 282 | + ((null known) (propertize "⚠" 'face `(:foreground "#FABD2F"))) |
| 283 | + (all-disabled (propertize "⚠" 'face `(:foreground "#FB4933"))) |
| 284 | + (t |
| 285 | + (apply #'concat |
| 286 | + (mapcar (lambda (args) |
| 287 | + (apply (lambda (num str face) |
| 288 | + (propertize (format str num) 'face face)) |
| 289 | + args)) |
| 290 | + `((,(length (gethash :error diags-by-type)) "•%d " error) |
| 291 | + (,(length (gethash :warning diags-by-type)) "•%d " warning) |
| 292 | + (,(length (gethash :note diags-by-type)) "•%d" success)))))) |
| 293 | + " ")))) |
| 294 | + |
242 | 295 | ;; |
243 | 296 | ;;; Flycheck |
244 | 297 |
|
|
255 | 308 | (when (and (bound-and-true-p flycheck-mode) |
256 | 309 | (or flycheck-current-errors |
257 | 310 | (eq 'running flycheck-last-status-change))) |
258 | | - (cl-loop for state in '((error . "#FB4933") |
259 | | - (warning . "#FABD2F") |
260 | | - (info . "#83A598")) |
261 | | - as lighter = (jcs-modeline--flycheck-lighter (car state)) |
262 | | - when lighter |
263 | | - concat (propertize lighter 'face `(:foreground ,(cdr state)))))) |
| 311 | + (concat |
| 312 | + (cl-loop for state in '((error . "#FB4933") |
| 313 | + (warning . "#FABD2F") |
| 314 | + (info . "#83A598")) |
| 315 | + as lighter = (jcs-modeline--flycheck-lighter (car state)) |
| 316 | + when lighter |
| 317 | + concat (propertize lighter 'face `(:foreground ,(cdr state)))) |
| 318 | + " "))) |
264 | 319 |
|
265 | 320 | ;; |
266 | 321 | ;;; Nov |
|
0 commit comments