Commit c2f1830d authored by Noam Postavsky's avatar Noam Postavsky
Browse files

Merge null and without-null regexp alists (Bug#27840, Bug#27873)

* lisp/progmodes/grep.el (grep-mode-font-lock-keywords): Allow for NUL
characters following filename in grep context lines.
(grep--regexp-alist-column, grep--regexp-alist-bin-matcher)
(grep-with-null-regexp-alist, grep-fallback-regexp-alist): Remove.
(grep-regexp-alist): Recombine their contents here.
(grep-mode):
* lisp/cedet/semantic/symref/grep.el
(semantic-symref-parse-tool-output-one-line):
* lisp/progmodes/xref.el (xref-collect-matches): Use the variable
`grep-regexp-alist' rather than the function.
parent 93511e94
......@@ -193,7 +193,7 @@ This shell should support pipe redirect syntax."
"Parse one line of grep output, and return it as a match list.
Moves cursor to end of the match."
(pcase-let
((`(,grep-re ,file-group ,line-group . ,_) (car (grep-regexp-alist))))
((`(,grep-re ,file-group ,line-group . ,_) (car grep-regexp-alist)))
(cond ((eq (oref tool :resulttype) 'file)
;; Search for files
(when (re-search-forward "^\\([^\n]+\\)$" nil t)
......
......@@ -31,7 +31,6 @@
(require 'compile)
(defgroup grep nil
"Run `grep' and display the results."
:group 'tools
......@@ -366,53 +365,44 @@ A grep buffer becomes most recent when you select Grep mode in it.
Notice that using \\[next-error] or \\[compile-goto-error] modifies
`compilation-last-buffer' rather than `grep-last-buffer'.")
(defconst grep--regexp-alist-column
;; Calculate column positions (col . end-col) of first grep match on a line
(cons
(lambda ()
(when grep-highlight-matches
(let* ((beg (match-end 0))
(end (save-excursion (goto-char beg) (line-end-position)))
(mbeg (text-property-any beg end 'font-lock-face 'grep-match-face)))
(when mbeg
(- mbeg beg)))))
(lambda ()
(when grep-highlight-matches
(let* ((beg (match-end 0))
(end (save-excursion (goto-char beg) (line-end-position)))
(mbeg (text-property-any beg end 'font-lock-face 'grep-match-face))
(mend (and mbeg (next-single-property-change mbeg 'font-lock-face nil end))))
(when mend
(- mend beg)))))))
(defconst grep--regexp-alist-bin-matcher
'("^Binary file \\(.+\\) matches$" 1 nil nil 0 1))
(defconst grep-with-null-regexp-alist
`(("^\\([^\0]+\\)\\(\0\\)\\([0-9]+\\):" 1 3 ,grep--regexp-alist-column nil nil
(2 '(face unspecified display ":")))
,grep--regexp-alist-bin-matcher)
"Regexp used to match grep hits.
See `compilation-error-regexp-alist'.")
(defconst grep-fallback-regexp-alist
`(;; 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 ,grep--regexp-alist-column)
,grep--regexp-alist-bin-matcher)
"Regexp used to match grep hits when `--null' is not supported.
See `compilation-error-regexp-alist'.")
(defvaralias 'grep-regex-alist 'grep-with-null-regexp-alist)
(make-obsolete-variable
'grep-regex-alist "Call `grep-regexp-alist' instead." "26.1")
;;;###autoload
(defun grep-regexp-alist ()
"Return a regexp alist to match grep hits.
The regexp used depends on `grep-use-null-filename-separator'.
See `compilation-error-regexp-alist' for format details."
(if grep-use-null-filename-separator
grep-with-null-regexp-alist grep-fallback-regexp-alist))
(defconst grep-regexp-alist
`((,(concat "^\\(?:"
;; Parse using NUL characters when `--null' is used.
;; Note that we must still assume no newlines in
;; filenames due to "foo: Is a directory." type
;; messages.
"\\(?1:[^\0\n]+\\)\\(?3:\0\\)\\(?2:[0-9]+\\):"
"\\|"
;; Fallback if `--null' is not used, 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.
"\\(?1:[^\n:]+?[^\n/:]\\):[\t ]*\\(?2:[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
(let* ((beg (match-end 0))
(end (save-excursion (goto-char beg) (line-end-position)))
(mbeg (text-property-any beg end 'font-lock-face 'grep-match-face)))
(when mbeg
(- mbeg beg)))))
.
,(lambda ()
(when grep-highlight-matches
(let* ((beg (match-end 0))
(end (save-excursion (goto-char beg) (line-end-position)))
(mbeg (text-property-any beg end 'font-lock-face 'grep-match-face))
(mend (and mbeg (next-single-property-change mbeg 'font-lock-face nil end))))
(when mend
(- mend beg))))))
nil nil
(3 '(face nil display ":")))
("^Binary file \\(.+\\) matches$" 1 nil nil 0 1))
"Regexp used to match grep hits.
See `compilation-error-regexp-alist' for format details.")
(defvar grep-first-column 0 ; bug#10594
"Value to use for `compilation-first-column' in grep buffers.")
......@@ -451,7 +441,9 @@ See `compilation-error-regexp-alist' for format details."
(2 grep-error-face nil t))
;; "filename-linenumber-" format is used for context lines in GNU grep,
;; "filename=linenumber=" for lines with function names in "git grep -p".
("^.+?[-=][0-9]+[-=].*\n" (0 grep-context-face)))
("^.+?\\([-=\0]\\)[0-9]+\\([-=]\\).*\n" (0 grep-context-face)
(1 (if (eq (char-after (match-beginning 1)) ?\0)
`(face nil display ,(match-string 2))))))
"Additional things to highlight in grep output.
This gets tacked on the end of the generated expressions.")
......@@ -781,7 +773,7 @@ This function is called from `compilation-filter-hook'."
(set (make-local-variable 'compilation-error-face)
grep-hit-face)
(set (make-local-variable 'compilation-error-regexp-alist)
(grep-regexp-alist))
grep-regexp-alist)
;; 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\\`"))
......
......@@ -929,7 +929,7 @@ IGNORES is a list of glob patterns."
(expand-file-name dir)
ignores))
(buf (get-buffer-create " *xref-grep*"))
(`(,grep-re ,file-group ,line-group . ,_) (car (grep-regexp-alist)))
(`(,grep-re ,file-group ,line-group . ,_) (car grep-regexp-alist))
(status nil)
(hits nil))
(with-current-buffer buf
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment