X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/6664fc59a8f296117ea98b943f062c0cc0e907c1..58635e4de85621d4f16befe15b1df44a637bd078:/lisp/progmodes/grep.el diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el index 3f5fa54381..a4c9b7fccb 100644 --- a/lisp/progmodes/grep.el +++ b/lisp/progmodes/grep.el @@ -1,7 +1,6 @@ ;;; grep.el --- run Grep as inferior of Emacs, parse match messages -;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +;; Copyright (C) 1985-1987, 1993-1999, 2001-2011 ;; Free Software Foundation, Inc. ;; Author: Roland McGrath @@ -73,7 +72,9 @@ SYMBOL should be one of `grep-command', `grep-template', Some grep programs are able to surround matches with special markers in grep output. Such markers can be used to highlight -matches in grep mode. +matches in grep mode. This requires `font-lock-mode' to be active +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 @@ -342,13 +343,17 @@ Notice that using \\[next-error] or \\[compile-goto-error] modifies ;;;###autoload (defconst grep-regexp-alist - '(("^\\(.+?\\)\\(:[ \t]*\\)\\([0-9]+\\)\\2" + '(("^\\(.+?\\)\\(:[ \t]*\\)\\([1-9][0-9]*\\)\\2" 1 3) ;; Rule to match column numbers is commented out since no known grep ;; produces them ;; ("^\\(.+?\\)\\(:[ \t]*\\)\\([0-9]+\\)\\2\\(?:\\([0-9]+\\)\\(?:-\\([0-9]+\\)\\)?\\2\\)?" ;; 1 3 (4 . 5)) - ("^\\(\\(.+?\\):\\([0-9]+\\):\\).*?\ + ;; 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. + ("^\\(\\(.+?\\):\\([1-9][0-9]*\\):\\).*?\ \\(\033\\[01;31m\\(?:\033\\[K\\)?\\)\\(.*?\\)\\(\033\\[[0-9]*m\\)" 2 3 ;; Calculate column positions (beg . end) of first grep match on a line @@ -357,7 +362,7 @@ Notice that using \\[next-error] or \\[compile-goto-error] modifies (- (match-beginning 4) (match-end 1))) . (lambda () (- (match-end 5) (match-end 1) - (- (match-end 4) (match-beginning 4))))) + (- (match-end 4) (match-beginning 4))))) nil 1) ("^Binary file \\(.+\\) matches$" 1 nil nil 0 1)) "Regexp used to match grep hits. See `compilation-error-regexp-alist'.") @@ -381,22 +386,22 @@ Notice that using \\[next-error] or \\[compile-goto-error] modifies (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[/a-zA-z]* started.*" - (0 '(face nil message nil help-echo nil mouse-face nil) t)) + (0 '(face nil compilation-message nil help-echo nil mouse-face nil) t)) ("^Grep[/a-zA-z]* finished \\(?:(\\(matches found\\))\\|with \\(no matches found\\)\\).*" - (0 '(face nil message nil help-echo nil mouse-face nil) t) + (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)) ("^Grep[/a-zA-z]* \\(exited abnormally\\|interrupt\\|killed\\|terminated\\)\\(?:.*with code \\([0-9]+\\)\\)?.*" - (0 '(face nil message nil help-echo nil mouse-face nil) t) + (0 '(face nil compilation-message nil help-echo nil mouse-face nil) t) (1 grep-error-face) (2 grep-error-face nil t)) ("^.+?-[0-9]+-.*\n" (0 grep-context-face)) - ;; Highlight grep matches and delete markers + ;; Highlight grep matches and delete markers. + ;; FIXME: Modifying the buffer text from font-lock is a bad idea! ("\\(\033\\[01;31m\\)\\(.*?\\)\\(\033\\[[0-9]*m\\)" ;; Refontification does not work after the markers have been ;; deleted. So we use the font-lock-face property here as Font @@ -406,12 +411,14 @@ Notice that using \\[next-error] or \\[compile-goto-error] modifies (progn ;; Delete markers with `replace-match' because it updates ;; the match-data, whereas `delete-region' would render it obsolete. + (syntax-ppss-flush-cache (match-beginning 0)) (replace-match "" t t nil 3) (replace-match "" t t nil 1)))) - ("\\(\033\\[[0-9;]*[mK]\\)" + ("\033\\[[0-9;]*[mK]" ;; Delete all remaining escape sequences ((lambda (bound)) - (replace-match "" t t nil 1)))) + (syntax-ppss-flush-cache (match-beginning 0)) + (replace-match "" t t)))) "Additional things to highlight in grep output. This gets tacked on the end of the generated expressions.") @@ -457,6 +464,8 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'." (when (eq grep-highlight-matches 'auto-detect) (grep-compute-defaults)) (unless (or (eq grep-highlight-matches 'auto-detect) + ;; Uses font-lock to parse color escapes. (Bug#8084) + (null font-lock-mode) (null grep-highlight-matches)) ;; `setenv' modifies `process-environment' let-bound in `compilation-start' ;; Any TERM except "dumb" allows GNU grep to use `--color=auto' @@ -561,7 +570,10 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'." (unless grep-find-command (setq grep-find-command (cond ((eq grep-find-use-xargs 'gnu) - (format "%s . -type f -print0 | %s -0 -e %s" + ;; Windows shells need the program file name + ;; after the pipe symbol be quoted if they use + ;; forward slashes as directory separators. + (format "%s . -type f -print0 | \"%s\" -0 -e %s" find-program xargs-program grep-command)) ((eq grep-find-use-xargs 'exec) (let ((cmd0 (format "%s . -type f -exec %s" @@ -572,21 +584,21 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'." (shell-quote-argument ";")) (1+ (length cmd0))))) (t - (format "%s . -type f -print | %s %s" + (format "%s . -type f -print | \"%s\" %s" find-program xargs-program grep-command))))) (unless grep-find-template (setq grep-find-template (let ((gcmd (format "%s %s " grep-program grep-options))) (cond ((eq grep-find-use-xargs 'gnu) - (format "%s . -type f -print0 | %s -0 -e %s" + (format "%s . -type f -print0 | \"%s\" -0 -e %s" find-program xargs-program gcmd)) ((eq grep-find-use-xargs 'exec) (format "%s . -type f -exec %s {} %s %s" find-program gcmd null-device (shell-quote-argument ";"))) (t - (format "%s . -type f -print | %s %s" + (format "%s . -type f -print | \"%s\" %s" find-program xargs-program gcmd)))))))) (when (eq grep-highlight-matches 'auto-detect) (setq grep-highlight-matches @@ -1042,5 +1054,4 @@ file name to `*.gz', and sets `grep-highlight-matches' to `always'." (provide 'grep) -;; arch-tag: 5a5b9169-a79d-4f38-9c38-f69615f39c4d ;;; grep.el ends here