Skip to content

Commit 4d36abc

Browse files
committed
Integrate flymake
1 parent 8ac5b61 commit 4d36abc

File tree

2 files changed

+71
-16
lines changed

2 files changed

+71
-16
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Place the following line in your config file:
1717

1818
## 📝 Todo List
1919

20-
- [ ] `flymake` integration
20+
- [x] `flymake` integration
2121

2222
## Contribute
2323

jcs-modeline.el

Lines changed: 70 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131

3232
;;; Code:
3333

34+
(require 'cl-lib)
35+
(require 'subr-x)
36+
3437
(require 'moody)
3538
(require 'minions)
3639
(require 'elenv)
@@ -52,10 +55,11 @@
5255
:group 'jcs-modeline)
5356

5457
(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))
5859
(: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))
5963
(:eval (moody-tab " %l : %c " 0 'up)) " %p"
6064
mode-line-end-spaces)
6165
"List of item to render on the right."
@@ -69,6 +73,13 @@
6973
(declare-function string-pixel-width "subr-x.el") ; TODO: remove this after 29.1
7074
(declare-function shr-string-pixel-width "shr.el") ; TODO: remove this after 29.1
7175

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+
7283
(defvar flycheck-current-errors)
7384
(defvar flycheck-last-status-change)
7485
(declare-function flycheck-has-current-errors-p "ext:flycheck.el")
@@ -148,23 +159,29 @@
148159

149160
(defun jcs-modeline--window-resize (&rest _)
150161
"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)
152165
;; Let's iterate it from outer to inner, so we must flip the right list.
153166
(right-list (reverse jcs-modeline-right)))
154167
(setq jcs-modeline--render-left nil
155168
jcs-modeline--render-right nil) ; reset
156169
(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)))
159175
(format (format-mode-line item))
160176
(width (jcs-modeline--str-len format))
161177
(new-width (+ current-width width)))
162178
(when (<= new-width (window-width))
163179
(setq current-width new-width)
164-
(push item (if odd jcs-modeline--render-left
180+
(push item (if is-left jcs-modeline--render-left
165181
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))))
168185
(setq jcs-modeline--render-left (reverse jcs-modeline--render-left)
169186
;; Since we iterate it from the edge, we don't need to reverse the right
170187
jcs-modeline--render-right jcs-modeline--render-right))
@@ -239,6 +256,42 @@
239256
"(%-d) ")
240257
text-scale-mode-amount)))
241258

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+
242295
;;
243296
;;; Flycheck
244297

@@ -255,12 +308,14 @@
255308
(when (and (bound-and-true-p flycheck-mode)
256309
(or flycheck-current-errors
257310
(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+
" ")))
264319

265320
;;
266321
;;; Nov

0 commit comments

Comments
 (0)