bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#25354: patch for this bug


From: Tom Tromey
Subject: bug#25354: patch for this bug
Date: Sat, 05 Aug 2017 22:25:14 -0600
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)

>>>>> "Eli" == Eli Zaretskii <eliz@gnu.org> writes:

Eli> Thanks.  This should be mentioned in NEWS, and the user manual needs
Eli> an update.

How about this?

Tom

commit 4cf134bf68e374df32876b411dd0c31c6bcde85e
Author: Tom Tromey <tom@tromey.com>
Date:   Sun Mar 5 10:48:41 2017 -0700

    Show number of errors in compilation-mode mode-line
    
    Bug#25354
    * lisp/progmodes/compile.el (compilation-num-errors-found): Provide
    default value.
    (compilation-num-warnings-found, compilation-num-infos-found): New
    defvars.
    (compilation-mode-line-errors): New defconst.
    (compilation-face): Remove.
    (compilation-type, compilation--note-type): New functions.
    (compilation-parse-errors): Call compilation--note-type.
    (compilation-start): Include compilation-mode-line-errors in
    mode-line-process.
    (compilation-setup): Initialize compilation-num-* variables to 0.
    (compilation-handle-exit): Include compilation-mode-line-errors in
    mode-line-process.
    * doc/emacs/building.texi (Compilation): Document new feature.

diff --git a/doc/emacs/building.texi b/doc/emacs/building.texi
index f7eb8fe..cc79eae 100644
--- a/doc/emacs/building.texi
+++ b/doc/emacs/building.texi
@@ -90,6 +90,10 @@ Compilation
 remains fixed while compilation output is added at the end of the
 buffer.
 
+  While compilation proceeds, the mode line is updated to show the
+number of errors, warnings, and informational messages that have been
+seen so far.
+
 @cindex compilation buffer, keeping point at end
 @vindex compilation-scroll-output
   If you change the variable @code{compilation-scroll-output} to a
diff --git a/etc/NEWS b/etc/NEWS
index b72793d..9d092db 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -732,6 +732,11 @@ where to place point after C-c M-r and C-c M-s.
 *** Messages from CMake are now recognized.
 
 +++
+*** The number of errors, warnings, and informational messages is now
+displayed in the mode line.  These are updated as compilation
+proceeds.
+
++++
 *** A new option 'dired-always-read-filesystem' default to nil.
 If non-nil, buffers visiting files are reverted before search them;
 for instance, in 'dired-mark-files-containing-regexp' a non-nil value
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index 31ec5a6..f0935cd 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -127,7 +127,21 @@ compilation-error
 (defvar compilation-arguments nil
   "Arguments that were given to `compilation-start'.")
 
-(defvar compilation-num-errors-found)
+(defvar compilation-num-errors-found 0)
+(defvar compilation-num-warnings-found 0)
+(defvar compilation-num-infos-found 0)
+
+(defconst compilation-mode-line-errors
+  '(" [" (:propertize (:eval (int-to-string compilation-num-errors-found))
+                      face compilation-error
+                      help-echo "Number of errors so far")
+    " " (:propertize (:eval (int-to-string compilation-num-warnings-found))
+                     face compilation-warning
+                     help-echo "Number of warnings so far")
+    " " (:propertize (:eval (int-to-string compilation-num-infos-found))
+                     face compilation-info
+                     help-echo "Number of informational messages so far")
+    "]"))
 
 ;; If you make any changes to `compilation-error-regexp-alist-alist',
 ;; be sure to run the ERT test in test/lisp/progmodes/compile-tests.el.
@@ -886,10 +900,10 @@ compilation-skip-visited
   :group 'compilation
   :version "22.1")
 
-(defun compilation-face (type)
-  (or (and (car type) (match-end (car type)) compilation-warning-face)
-      (and (cdr type) (match-end (cdr type)) compilation-info-face)
-      compilation-error-face))
+(defun compilation-type (type)
+  (or (and (car type) (match-end (car type)) 1)
+      (and (cdr type) (match-end (cdr type)) 0)
+      2))
 
 ;;   LOC (or location) is a list of (COLUMN LINE FILE-STRUCTURE nil nil)
 
@@ -1334,6 +1348,14 @@ compilation--parse-region
 
     (compilation-parse-errors start end)))
 
+(defun compilation--note-type (type)
+  "Note that a new message with severity TYPE was seen.
+This updates the appropriate variable used by the mode-line."
+  (cl-case type
+    (0 (cl-incf compilation-num-infos-found))
+    (1 (cl-incf compilation-num-warnings-found))
+    (2 (cl-incf compilation-num-errors-found))))
+
 (defun compilation-parse-errors (start end &rest rules)
   "Parse errors between START and END.
 The errors recognized are the ones specified in RULES which default
@@ -1397,14 +1419,17 @@ compilation-parse-errors
                              file line end-line col end-col (or type 2) fmt))
 
             (when (integerp file)
+              (setq type (if (consp type)
+                             (compilation-type type)
+                           (or type 2)))
+              (compilation--note-type type)
+
               (compilation--put-prop
                file 'font-lock-face
-               (if (consp type)
-                   (compilation-face type)
-                 (symbol-value (aref [compilation-info-face
-                                      compilation-warning-face
-                                      compilation-error-face]
-                                     (or type 2))))))
+               (symbol-value (aref [compilation-info-face
+                                    compilation-warning-face
+                                    compilation-error-face]
+                                   type))))
 
             (compilation--put-prop
              line 'font-lock-face compilation-line-face)
@@ -1768,7 +1793,8 @@ compilation-start
                                                       outbuf command))))
               ;; Make the buffer's mode line show process state.
               (setq mode-line-process
-                    '(:propertize ":%s" face compilation-mode-line-run))
+                    '((:propertize ":%s" face compilation-mode-line-run)
+                      compilation-mode-line-errors))
 
               ;; Set the process as killable without query by default.
               ;; This allows us to start a new compilation without
@@ -1797,7 +1823,8 @@ compilation-start
          (message "Executing `%s'..." command)
          ;; Fake mode line display as if `start-process' were run.
          (setq mode-line-process
-               '(:propertize ":run" face compilation-mode-line-run))
+               '((:propertize ":run" face compilation-mode-line-run)
+                  compilation-mode-line-errors))
          (force-mode-line-update)
          (sit-for 0)                   ; Force redisplay
          (save-excursion
@@ -2106,6 +2133,9 @@ compilation-setup
   (make-local-variable 'compilation-messages-start)
   (make-local-variable 'compilation-error-screen-columns)
   (make-local-variable 'overlay-arrow-position)
+  (setq-local compilation-num-errors-found 0)
+  (setq-local compilation-num-warnings-found 0)
+  (setq-local compilation-num-infos-found 0)
   (set (make-local-variable 'overlay-arrow-string) "")
   (setq next-error-overlay-arrow-position nil)
   (add-hook 'kill-buffer-hook
@@ -2195,16 +2225,18 @@ compilation-handle-exit
     (add-text-properties omax (point)
                         (append '(compilation-handle-exit t) nil))
     (setq mode-line-process
-         (let ((out-string (format ":%s [%s]" process-status (cdr status)))
-               (msg (format "%s %s" mode-name
-                            (replace-regexp-in-string "\n?$" ""
-                                                       (car status)))))
-           (message "%s" msg)
-           (propertize out-string
-                       'help-echo msg
-                       'face (if (> exit-status 0)
-                                 'compilation-mode-line-fail
-                               'compilation-mode-line-exit))))
+          (list
+           (let ((out-string (format ":%s [%s]" process-status (cdr status)))
+                 (msg (format "%s %s" mode-name
+                              (replace-regexp-in-string "\n?$" ""
+                                                        (car status)))))
+             (message "%s" msg)
+             (propertize out-string
+                         'help-echo msg
+                         'face (if (> exit-status 0)
+                                   'compilation-mode-line-fail
+                                 'compilation-mode-line-exit)))
+           compilation-mode-line-errors))
     ;; Force mode line redisplay soon.
     (force-mode-line-update)
     (if (and opoint (< opoint omax))





reply via email to

[Prev in Thread] Current Thread [Next in Thread]