(defvar grep-context-face 'shadow
"Face name to use for grep context lines.")
+(defvar grep-num-matches-found 0)
+
+(defconst grep-mode-line-matches
+ `(" [" (:propertize (:eval (int-to-string grep-num-matches-found))
+ face ,grep-hit-face
+ help-echo "Number of matches so far")
+ "]"))
+
(defvar grep-mode-font-lock-keywords
'(;; Command output lines.
(": \\(.+\\): \\(?:Permission denied\\|No such \\(?:file or directory\\|device or address\\)\\)$"
;; remove match from grep-regexp-alist before fontifying
("^Grep[/a-zA-z]* started.*"
(0 '(face nil compilation-message nil help-echo nil mouse-face nil) t))
- ("^Grep[/a-zA-z]* finished \\(?:(\\(matches found\\))\\|with \\(no matches found\\)\\).*"
+ ("^Grep[/a-zA-z]* finished with \\(?:\\(\\(?:[0-9]+ \\)?matches found\\)\\|\\(no matches found\\)\\).*"
(0 '(face nil compilation-message nil help-echo nil mouse-face nil) t)
(1 compilation-info-face nil t)
(2 compilation-warning-face nil t))
(setenv "GREP_COLOR" "01;31")
;; GREP_COLORS is used in GNU grep 2.5.2 and later versions
(setenv "GREP_COLORS" "mt=01;31:fn=:ln=:bn=:se=:sl=:cx=:ne"))
+ (setq-local grep-num-matches-found 0)
(set (make-local-variable 'compilation-exit-message-function)
- (lambda (status code msg)
- (if (eq status 'exit)
- ;; This relies on the fact that `compilation-start'
- ;; sets buffer-modified to nil before running the command,
- ;; so the buffer is still unmodified if there is no output.
- (cond ((and (zerop code) (buffer-modified-p))
- '("finished (matches found)\n" . "matched"))
- ((not (buffer-modified-p))
- '("finished with no matches found\n" . "no match"))
- (t
- (cons msg code)))
- (cons msg code))))
+ 'grep-exit-message)
(run-hooks 'grep-setup-hook))
+(defun grep-exit-message (status code msg)
+ "Return a status message for grep results."
+ (if (eq status 'exit)
+ ;; This relies on the fact that `compilation-start'
+ ;; sets buffer-modified to nil before running the command,
+ ;; so the buffer is still unmodified if there is no output.
+ (cond ((and (zerop code) (buffer-modified-p))
+ (if (> grep-num-matches-found 0)
+ (cons (format "finished with %d matches found\n" grep-num-matches-found)
+ "matched")
+ '("finished with matches found\n" . "matched")))
+ ((not (buffer-modified-p))
+ '("finished with no matches found\n" . "no match"))
+ (t
+ (cons msg code)))
+ (cons msg code)))
+
(defun grep-filter ()
"Handle match highlighting escape sequences inserted by the grep process.
This function is called from `compilation-filter-hook'."
(while (re-search-forward "\033\\[0?1;31m\\(.*?\\)\033\\[[0-9]*m" end 1)
(replace-match (propertize (match-string 1)
'face nil 'font-lock-face grep-match-face)
- t t))
+ t t)
+ (cl-incf grep-num-matches-found))
;; Delete all remaining escape sequences
(goto-char beg)
(while (re-search-forward "\033\\[[0-9;]*[mK]" end 1)
grep-hit-face)
(set (make-local-variable 'compilation-error-regexp-alist)
grep-regexp-alist)
+ (set (make-local-variable 'compilation-mode-line-errors)
+ grep-mode-line-matches)
;; compilation-directory-matcher can't be nil, so we set it to a regexp that
;; can never match.
(set (make-local-variable 'compilation-directory-matcher) '("\\`a\\`"))