1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Allow the flymake mode line indicator to be customized

* doc/misc/flymake.texi (Customizable variables): Mention it.

* lisp/progmodes/flymake.el (flymake-mode-line-indicator-format):
New variable (bug#33740).
(flymake--mode-line-format): Use it.
This commit is contained in:
Lars Ingebrigtsen 2020-12-29 03:10:00 +01:00
parent 40d1633259
commit 37049ee78c
3 changed files with 109 additions and 96 deletions

View file

@ -213,6 +213,9 @@ This section summarizes customization variables used for the
configuration of the Flymake user interface.
@vtable @code
@item flymake-mode-line-indicator-format
Format to use for the Flymake mode line indicator.
@item flymake-no-changes-timeout
If any changes are made to the buffer, syntax check is automatically
started after this many seconds, unless the user makes another change,

View file

@ -1732,6 +1732,11 @@ height of lines or width of chars.
When non-nil, use a new xwidget webkit session after bookmark jump.
Otherwise, it will use 'xwidget-webkit-last-session'.
** Flymake mode
+++
*** New user option 'flymake-mode-line-indicator-format'.
** Flyspell mode
+++

View file

@ -1190,6 +1190,16 @@ default) no filter is applied."
(put 'flymake--mode-line-format 'risky-local-variable t)
(defcustom flymake-mode-line-indicator-format " Flymake%s[%e %w %n]"
"Format to use for the Flymake mode line indicator.
The following format characters can be used:
%s: The status.
%e: The number of errors.
%w: The number of warnings.
%n: The number of notes."
:version "28.1"
:type 'string)
(defun flymake--mode-line-format ()
"Produce a pretty minor mode indicator."
@ -1207,102 +1217,97 @@ default) no filter is applied."
diags-by-type)))
(flymake--backend-state-diags state)))
flymake--backend-state)
`((:propertize " Flymake"
mouse-face mode-line-highlight
help-echo
,(concat (format "%s known backends\n" (length known))
(format "%s running\n" (length running))
(format "%s disabled\n" (length disabled))
"mouse-1: Display minor mode menu\n"
"mouse-2: Show help for minor mode")
keymap
,(let ((map (make-sparse-keymap)))
(define-key map [mode-line down-mouse-1]
flymake-menu)
(define-key map [mode-line mouse-2]
(lambda ()
(interactive)
(describe-function 'flymake-mode)))
map))
,@(pcase-let ((`(,ind ,face ,explain)
(cond ((null known)
'("?" nil "No known backends"))
(some-waiting
`("Wait" compilation-mode-line-run
,(format "Waiting for %s running backend(s)"
(length some-waiting))))
(all-disabled
'("!" compilation-mode-line-run
"All backends disabled"))
(t
'(nil nil nil)))))
(when ind
`((":"
(:propertize ,ind
face ,face
help-echo ,explain
keymap
,(let ((map (make-sparse-keymap)))
(define-key map [mode-line mouse-1]
'flymake-switch-to-log-buffer)
map))))))
,@(unless (or all-disabled
(null known))
(cl-loop
with types = (hash-table-keys diags-by-type)
with _augmented = (cl-loop for extra in '(:error :warning)
do (cl-pushnew extra types
:key #'flymake--severity))
for type in (cl-sort types #'> :key #'flymake--severity)
for diags = (gethash type diags-by-type)
for face = (flymake--lookup-type-property type
'mode-line-face
'compilation-error)
when (or diags
(cond ((eq flymake-suppress-zero-counters t)
nil)
(flymake-suppress-zero-counters
(>= (flymake--severity type)
(warning-numeric-level
flymake-suppress-zero-counters)))
(t t)))
collect `(:propertize
,(format "%d" (length diags))
face ,face
mouse-face mode-line-highlight
keymap
,(let ((map (make-sparse-keymap))
(type type))
(define-key map (vector 'mode-line
mouse-wheel-down-event)
(lambda (event)
(interactive "e")
(with-selected-window (posn-window (event-start event))
(flymake-goto-prev-error 1 (list type) t))))
(define-key map (vector 'mode-line
mouse-wheel-up-event)
(lambda (event)
(interactive "e")
(with-selected-window (posn-window (event-start event))
(flymake-goto-next-error 1 (list type) t))))
map)
help-echo
,(concat (format "%s diagnostics of type %s\n"
(propertize (format "%d"
(length diags))
'face face)
(propertize (format "%s" type)
'face face))
(format "%s/%s: previous/next of this type"
mouse-wheel-down-event
mouse-wheel-up-event)))
into forms
finally return
`((:propertize "[")
,@(cl-loop for (a . rest) on forms by #'cdr
collect a when rest collect
'(:propertize " "))
(:propertize "]")))))))
(format-spec
(propertize
flymake-mode-line-indicator-format
'mouse-face 'mode-line-highlight
'help-echo (concat (format "%s known backends\n" (length known))
(format "%s running\n" (length running))
(format "%s disabled\n" (length disabled))
"mouse-1: Display minor mode menu\n"
"mouse-2: Show help for minor mode")
'keymap (let ((map (make-sparse-keymap)))
(define-key map [mode-line down-mouse-1]
flymake-menu)
(define-key map [mode-line mouse-2]
(lambda ()
(interactive)
(describe-function 'flymake-mode)))
map))
(cons
(cons
?s (pcase-let ((`(,ind ,face ,explain)
(cond ((null known)
'("?" nil "No known backends"))
(some-waiting
`("Wait" compilation-mode-line-run
,(format "Waiting for %s running backend(s)"
(length some-waiting))))
(all-disabled
'("!" compilation-mode-line-run
"All backends disabled"))
(t
'(nil nil nil)))))
(if (not ind)
""
(concat
":" (propertize ind
'face face
'help-echo explain
'keymap (let ((map (make-sparse-keymap)))
(define-key map [mode-line mouse-1]
'flymake-switch-to-log-buffer)
map))))))
(cl-loop
with types = (hash-table-keys diags-by-type)
with _augmented = (cl-loop for extra in '(:error :warning)
do (cl-pushnew extra types
:key #'flymake--severity))
for type in (cl-sort types #'> :key #'flymake--severity)
for diags = (gethash type diags-by-type)
for face = (flymake--lookup-type-property
type 'mode-line-face 'compilation-error)
when (or diags
(cond ((eq flymake-suppress-zero-counters t)
nil)
(flymake-suppress-zero-counters
(>= (flymake--severity type)
(warning-numeric-level
flymake-suppress-zero-counters)))
(t t)))
collect (cons
(elt (format "%s" type) 1)
(propertize
(format "%d" (length diags))
'face face
'mouse-face 'mode-line-highlight
'keymap
(let ((map (make-sparse-keymap))
(type type))
(define-key map (vector 'mode-line
mouse-wheel-down-event)
(lambda (event)
(interactive "e")
(with-selected-window (posn-window (event-start event))
(flymake-goto-prev-error 1 (list type) t))))
(define-key map (vector 'mode-line
mouse-wheel-up-event)
(lambda (event)
(interactive "e")
(with-selected-window (posn-window (event-start event))
(flymake-goto-next-error 1 (list type) t))))
map)
'help-echo
(concat (format "%s diagnostics of type %s\n"
(propertize (format "%d"
(length diags))
'face face)
(propertize (format "%s" type)
'face face))
(format "%s/%s: previous/next of this type"
mouse-wheel-down-event
mouse-wheel-up-event))))))
nil t)))
;;; Diagnostics buffer