diff options
Diffstat (limited to 'lisp/progmodes/grep.el')
-rw-r--r-- | lisp/progmodes/grep.el | 86 |
1 files changed, 43 insertions, 43 deletions
diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el index d4caf48e089..048fa1180a9 100644 --- a/lisp/progmodes/grep.el +++ b/lisp/progmodes/grep.el @@ -1,4 +1,4 @@ -;;; grep.el --- run `grep' and display the results +;;; grep.el --- run `grep' and display the results -*- lexical-binding:t -*- ;; Copyright (C) 1985-1987, 1993-1999, 2001-2015 Free Software ;; Foundation, Inc. @@ -77,11 +77,10 @@ in grep buffers, so if you have globally disabled font-lock-mode, you will not get highlighting. This option sets the environment variable GREP_COLORS to specify -markers for highlighting and GREP_OPTIONS to add the --color -option in front of any explicit grep options before starting -the grep. +markers for highlighting and adds the --color option in front of +any explicit grep options before starting the grep. -When this option is `auto', grep uses `--color=auto' to highlight +When this option is `auto', grep uses `--color' to highlight matches only when it outputs to a terminal (when `grep' is the last command in the pipe), thus avoiding the use of any potentially-harmful escape sequences when standard output goes to a file or pipe. @@ -97,7 +96,7 @@ To change the default value, use Customize or call the function :type '(choice (const :tag "Do not highlight matches with grep markers" nil) (const :tag "Highlight matches with grep markers" t) (const :tag "Use --color=always" always) - (const :tag "Use --color=auto" auto) + (const :tag "Use --color" auto) (other :tag "Not Set" auto-detect)) :set 'grep-apply-setting :version "22.1" @@ -345,16 +344,11 @@ Notice that using \\[next-error] or \\[compile-goto-error] modifies ;;;###autoload (defconst grep-regexp-alist '( - ;; Rule to match column numbers is commented out since no known grep - ;; produces them - ;; ("^\\(.+?\\)\\(:[ \t]*\\)\\([1-9][0-9]*\\)\\2\\(?:\\([1-9][0-9]*\\)\\(?:-\\([1-9][0-9]*\\)\\)?\\2\\)?" - ;; 1 3 (4 . 5)) - ;; Note that we want to use as tight a regexp as we can to try and - ;; handle weird file names (with colons in them) as well as possible. - ;; E.g. we use [1-9][0-9]* rather than [0-9]+ so as to accept ":034:" - ;; in file names. - ("^\\(.+?\\)\\(:[ \t]*\\)\\([1-9][0-9]*\\)\\2" - 1 3 + ;; Use a tight regexp to handle weird file names (with colons + ;; in them) as well as possible. E.g., use [1-9][0-9]* rather + ;; than [0-9]+ so as to accept ":034:" in file names. + ("^\\(.*?[^/\n]\\):[ \t]*\\([1-9][0-9]*\\)[ \t]*:" + 1 2 ;; Calculate column positions (col . end-col) of first grep match on a line ((lambda () (when grep-highlight-matches @@ -467,10 +461,6 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'." ;; `setenv' modifies `process-environment' let-bound in `compilation-start' ;; Any TERM except "dumb" allows GNU grep to use `--color=auto' (setenv "TERM" "emacs-grep") - (setenv "GREP_OPTIONS" - (concat (getenv "GREP_OPTIONS") - " --color=" (if (eq grep-highlight-matches 'always) - "always" "auto"))) ;; GREP_COLOR is used in GNU grep 2.5.1, but deprecated in later versions (setenv "GREP_COLOR" "01;31") ;; GREP_COLORS is used in GNU grep 2.5.2 and later versions @@ -567,10 +557,28 @@ This function is called from `compilation-filter-hook'." (looking-at (concat (regexp-quote hello-file) ":[0-9]+:English"))))))))) + + (when (eq grep-highlight-matches 'auto-detect) + (setq grep-highlight-matches + (with-temp-buffer + (and (grep-probe grep-program '(nil t nil "--help")) + (progn + (goto-char (point-min)) + (search-forward "--color" nil t)) + ;; Windows and DOS pipes fail `isatty' detection in Grep. + (if (memq system-type '(windows-nt ms-dos)) + 'always 'auto))))) + (unless (and grep-command grep-find-command grep-template grep-find-template) (let ((grep-options - (concat (if grep-use-null-device "-n" "-nH") + (concat (and grep-highlight-matches + (grep-probe grep-program + `(nil nil nil "--color" "x" ,null-device) + nil 1) + (if (eq grep-highlight-matches 'always) + "--color=always " "--color ")) + (if grep-use-null-device "-n" "-nH") (if (grep-probe grep-program `(nil nil nil "-e" "foo" ,null-device) nil 1) @@ -637,16 +645,6 @@ This function is called from `compilation-filter-hook'." (t (format "%s . <X> -type f <F> -print | \"%s\" %s" find-program xargs-program gcmd)))))))) - (when (eq grep-highlight-matches 'auto-detect) - (setq grep-highlight-matches - (with-temp-buffer - (and (grep-probe grep-program '(nil t nil "--help")) - (progn - (goto-char (point-min)) - (search-forward "--color" nil t)) - ;; Windows and DOS pipes fail `isatty' detection in Grep. - (if (memq system-type '(windows-nt ms-dos)) - 'always 'auto))))) ;; Save defaults for this host. (setq grep-host-defaults-alist @@ -805,16 +803,20 @@ substitution string. Note dynamic scoping of variables.") (defun grep-expand-template (template &optional regexp files dir excl) "Patch grep COMMAND string replacing <C>, <D>, <F>, <R>, and <X>." - (let ((command template) - (cf case-fold-search) - (case-fold-search nil)) + (let* ((command template) + (env `((cf . ,case-fold-search) + (excl . ,excl) + (dir . ,dir) + (files . ,files) + (regexp . ,regexp))) + (case-fold-search nil)) (dolist (kw grep-expand-keywords command) (if (string-match (car kw) command) (setq command (replace-match (or (if (symbolp (cdr kw)) - (symbol-value (cdr kw)) - (save-match-data (eval (cdr kw)))) + (eval (cdr kw) env) + (save-match-data (eval (cdr kw) env))) "") t t command)))))) @@ -901,7 +903,7 @@ This command shares argument histories with \\[rgrep] and \\[grep]." (confirm (equal current-prefix-arg '(4)))) (list regexp files dir confirm)))))) (when (and (stringp regexp) (> (length regexp) 0)) - (unless (and dir (file-directory-p dir) (file-readable-p dir)) + (unless (and dir (file-accessible-directory-p dir)) (setq dir default-directory)) (let ((command regexp)) (if (null files) @@ -982,7 +984,7 @@ to specify a command to run." (confirm (equal current-prefix-arg '(4)))) (list regexp files dir confirm)))))) (when (and (stringp regexp) (> (length regexp) 0)) - (unless (and dir (file-directory-p dir) (file-readable-p dir)) + (unless (and dir (file-accessible-directory-p dir)) (setq dir default-directory)) (if (null files) (if (not (string= regexp (if (consp grep-find-command) @@ -1055,7 +1057,7 @@ to specify a command to run." (setq default-directory dir))))))) ;;;###autoload -(defun zrgrep (regexp &optional files dir confirm grep-find-template) +(defun zrgrep (regexp &optional files dir confirm template) "Recursively grep for REGEXP in gzipped FILES in tree rooted at DIR. Like `rgrep' but uses `zgrep' for `grep-program', sets the default file name to `*.gz', and sets `grep-highlight-matches' to `always'." @@ -1090,10 +1092,8 @@ file name to `*.gz', and sets `grep-highlight-matches' to `always'." (list regexp files dir confirm grep-find-template))))))) ;; Set `grep-highlight-matches' to `always' ;; since `zgrep' puts filters in the grep output. - (let ((grep-highlight-matches 'always)) - ;; `rgrep' uses the dynamically bound value `grep-find-template' - ;; from the argument `grep-find-template' whose value is computed - ;; in the `interactive' spec. + (let ((grep-find-template template) + (grep-highlight-matches 'always)) (rgrep regexp files dir confirm))) ;;;###autoload |