changeset 54372:a4d3c17f991f

(kill-grep): Move here from compile.el (grep-error, grep-hit-face, grep-error-face) (grep-mode-font-lock-keywords): New variables. (grep-regexp-alist): Simplify regexp and add `binary' case. (grep-mode): New mode. (grep-process-setup): Simplify.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Thu, 11 Mar 2004 22:56:19 +0000
parents 3b169dbc05d2
children 9685a42b7c56
files lisp/progmodes/grep.el
diffstat 1 files changed, 47 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/progmodes/grep.el	Thu Mar 11 22:54:34 2004 +0000
+++ b/lisp/progmodes/grep.el	Thu Mar 11 22:56:19 2004 +0000
@@ -194,6 +194,8 @@
   "Keymap for grep buffers.
 `compilation-minor-mode-map' is a cdr of this.")
 
+(defalias 'kill-grep 'kill-compilation)
+
 ;;;; TODO --- refine this!!
 
 ;;; (defcustom grep-use-compilation-buffer t
@@ -213,12 +215,39 @@
 Notice that using \\[next-error] or \\[compile-goto-error] modifies
 `complation-last-buffer' rather than `grep-last-buffer'.")
 
-;; Note: the character class after the optional drive letter does not
-;; include a space to support file names with blanks.
 (defvar grep-regexp-alist
-  '(("\\([a-zA-Z]?:?.+?\\)[:( \t]+\\([0-9]+\\)[:) \t]" 1 2))
+  '(("^\\(.+?\\)[:( \t]+\\([0-9]+\\)[:) \t]" 1 2)
+    ("^Binary file \\(.+\\) matches$" 1 nil nil 1))
   "Regexp used to match grep hits.  See `compilation-error-regexp-alist'.")
 
+(defvar grep-error "grep hit"
+  "Message to print when no matches are found.")
+
+;; Reverse the colors because grep hits are not errors (though we jump there
+;; with `next-error'), and unreadable files can't be gone to.
+(defvar grep-hit-face	compilation-info-face
+  "Face name to use for grep hits.")
+
+(defvar grep-error-face	compilation-error-face
+  "Face name to use for grep error messages.")
+
+(defvar grep-mode-font-lock-keywords
+   '(;; Command output lines.
+     ("^\\([A-Za-z_0-9/\.+-]+\\)[ \t]*:" 1 font-lock-function-name-face)
+     (": \\(.+\\): \\(?:Permission denied\\|No such \\(?:file or directory\\|device or address\\)\\)$"
+      1 grep-error-face)
+     ;; remove match from grep-regexp-alist before fontifying
+     ("^Grep finished \\(?:(\\(matches found\\))\\|with \\(no matches found\\)\\).*"
+      (0 '(face nil message nil help-echo nil mouse-face nil) t)
+      (1 grep-hit-face nil t)
+      (2 grep-error-face nil t))
+     ("^Grep \\(exited abnormally\\) with code \\([0-9]+\\).*"
+      (0 '(face nil message nil help-echo nil mouse-face nil) t)
+      (1 compilation-warning-face)
+      (2 compilation-line-face)))
+   "Additional things to highlight in grep output.
+This gets tacked on the end of the generated expressions.")
+
 (defvar grep-program
   ;; Currently zgrep has trouble.  It runs egrep instead of grep,
   ;; and it doesn't pass along long options right.
@@ -251,9 +280,7 @@
 
 (defun grep-process-setup ()
   "Setup compilation variables and buffer for `grep'.
-Set up `compilation-exit-message-function' and `compilation-window-height'.
-Sets `grep-last-buffer' and runs `grep-setup-hook'."
-  (setq grep-last-buffer (current-buffer))
+Set up `compilation-exit-message-function' and run `grep-setup-hook'."
   (set (make-local-variable 'compilation-exit-message-function)
        (lambda (status code msg)
 	 (if (eq status 'exit)
@@ -264,13 +291,6 @@
 		   (t
 		    (cons msg code)))
 	   (cons msg code))))
-  (if grep-window-height
-      (set (make-local-variable 'compilation-window-height)
-	   grep-window-height))
-  (set (make-local-variable 'compile-auto-highlight)
-       grep-auto-highlight)
-  (set (make-local-variable 'compilation-scroll-output)
-       grep-scroll-output)
   (run-hooks 'grep-setup-hook))
 
 (defun grep-compute-defaults ()
@@ -402,15 +422,20 @@
 
   ;; Setting process-setup-function makes exit-message-function work
   ;; even when async processes aren't supported.
-  (let* ((compilation-process-setup-function 'grep-process-setup)
-	 (buf (compile-internal (if (and grep-use-null-device null-device)
-				    (concat command-args " " null-device)
-				  command-args)
-				"No more grep hits" "grep"
-				;; Give it a simpler regexp to match.
-				nil grep-regexp-alist
-				nil nil nil nil nil nil
-				highlight-regexp grep-mode-map)))))
+  (let ((compilation-process-setup-function 'grep-process-setup))
+    (compilation-start (if (and grep-use-null-device null-device)
+			   (concat command-args " " null-device)
+			 command-args)
+		       'grep-mode nil highlight-regexp)))
+
+;;;###autoload (autoload 'grep-mode "grep" nil t)
+(define-compilation-mode grep-mode "Grep"
+  "Sets `grep-last-buffer' and `compilation-window-height'."
+  (setq grep-last-buffer (current-buffer))
+  (set (make-local-variable 'compilation-error-face)
+       grep-hit-face)
+  (set (make-local-variable 'compilation-error-regexp-alist)
+       grep-regexp-alist))
 
 ;; This is a copy of find-tag-default from etags.el.
 (defun grep-tag-default ()