]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow the flymake mode line indicator to be customized
authorLars Ingebrigtsen <larsi@gnus.org>
Tue, 29 Dec 2020 02:10:00 +0000 (03:10 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Tue, 29 Dec 2020 02:10:00 +0000 (03:10 +0100)
* 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.

doc/misc/flymake.texi
etc/NEWS
lisp/progmodes/flymake.el

index 8f2954bdf4fc1a9a76e1f430842042eeefb1f198..b8744f0323f9d478e513e3fcea7a8be5afa58c53 100644 (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,
index cd4006170d284a20a3e3fdc6fa25160610444172..6348c1d8eefb0713d95c8f6f1f7b4db0f52825a2 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -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
 
 +++
index 40bb90d0f15a6424659159fec83d2489163b434c..e78d5d32fffcaae1870cff858788b689e96e6edd 100644 (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