Mercurial > emacs
diff lisp/progmodes/compile.el @ 17242:7dd0da53476f
(grep-program): New variable.
(grep-command): Use it, and test whether it supports the -e
option; fix doc string (last command is stored in history variable).
(grep-null-device): Declare before grep-program and grep-command.
(grep-find-use-xargs, grep-find-command, grep-find-history):
New variables.
(grep-find): New command.
(grep): Only concatenate grep-null-device to COMMAND when it's
not nil (to support grep-find).
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 24 Mar 1997 23:59:44 +0000 |
parents | e54588a6cea9 |
children | 6ee6f94817dc |
line wrap: on
line diff
--- a/lisp/progmodes/compile.el Mon Mar 24 20:38:28 1997 +0000 +++ b/lisp/progmodes/compile.el Mon Mar 24 23:59:44 1997 +0000 @@ -256,8 +256,52 @@ '(("^\\([a-zA-Z]?:?[^:( \t\n]+\\)[:( \t]+\\([0-9]+\\)[:) \t]" 1 2)) "Regexp used to match grep hits. See `compilation-error-regexp-alist'.") -(defvar grep-command "grep -n " - "Last grep command used in \\[grep]; default for next grep.") +;; Use zgrep if available, to work nicely with compressed files. +;; Otherwise, use ordinary grep. +(defvar grep-program + (if (equal (condition-case nil ; in case "zgrep" isn't in exec-path + (call-process "zgrep" nil nil nil + "foo" grep-null-device) + (error nil)) + 1) + "zgrep" + "grep") + "The default grep program for `grep-command' and `grep-find-command'.") + +;; Use -e if grep supports it, +;; because that avoids lossage if the pattern starts with `-'. +(defvar grep-command + (if (equal (condition-case nil ; in case "grep" isn't in exec-path + (call-process grep-program nil nil nil + "-e" "foo" grep-null-device) + (error nil)) + 1) + (format "%s -n -e " grep-program) + (format "%s -n " grep-program)) + "The default grep command for \\[grep].") + +(defvar grep-find-use-xargs + (if (equal (call-process "find" nil nil nil + grep-null-device "-print0") + 0) + 'gnu) + "Whether \\[grep-find] uses the `xargs' utility by default. + +If nil, it uses `grep -exec'; if `gnu', it uses `find -print0' and `xargs -0'; +if not nil and not `gnu', it uses `find -print' and `xargs'. + +This variable's value takes effect when `compile.el' is loaded +by influencing the default value for the variable `grep-find-command'.") + +(defvar grep-find-command + (cond ((eq grep-find-use-xargs 'gnu) + (format "find . -type f -print0 | xargs -0 -e %s" grep-command)) + (grep-find-use-xargs + (format "find . -type f -print | xargs %s" grep-command)) + (t (cons (format "find . -type f -exec %s {} /dev/null \\;" + grep-command) + (+ 22 (length grep-command))))) + "The default find command for \\[grep-find].") ;;;###autoload (defvar compilation-search-path '(nil) @@ -308,6 +352,7 @@ (defvar compile-history nil) ;; History of grep commands. (defvar grep-history nil) +(defvar grep-find-history nil) (defun compilation-mode-font-lock-keywords () "Return expressions to highlight in Compilation mode." @@ -392,11 +437,28 @@ ;; 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 (concat command-args " " grep-null-device) + (buf (compile-internal (if grep-null-device + (concat command-args " " grep-null-device) + command-args) "No more grep hits" "grep" ;; Give it a simpler regexp to match. nil grep-regexp-alist))))) + +;;;###autoload +(defun grep-find (command-args) + "Run grep via find, with user-specified args, and collect output in a buffer. +While find runs asynchronously, you can use the \\[next-error] command +to find the text that grep hits refer to. + +This command uses a special history list for its arguments, so you can +easily repeat a find command." + (interactive + (list (read-from-minibuffer "Run find (like this): " + grep-find-command nil nil 'grep-find-history))) + (let ((grep-null-device nil)) ; see grep + (grep command-args))) + (defun compile-internal (command error-message &optional name-of-mode parser regexp-alist name-function)