2014-04-12 15:38:06 -04:00
|
|
|
;;; grep.el --- run `grep' and display the results -*- lexical-binding:t -*-
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2020-01-01 00:19:43 +00:00
|
|
|
;; Copyright (C) 1985-1987, 1993-1999, 2001-2020 Free Software
|
2015-01-01 14:26:41 -08:00
|
|
|
;; Foundation, Inc.
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
;; Author: Roland McGrath <roland@gnu.org>
|
2019-05-25 13:43:06 -07:00
|
|
|
;; Maintainer: emacs-devel@gnu.org
|
2003-11-23 20:56:10 +00:00
|
|
|
;; Keywords: tools, processes
|
|
|
|
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
2008-05-06 07:25:26 +00:00
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
2003-11-23 20:56:10 +00:00
|
|
|
;; it under the terms of the GNU General Public License as published by
|
2008-05-06 07:25:26 +00:00
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
;; (at your option) any later version.
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
;; GNU General Public License for more details.
|
|
|
|
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
2017-09-13 15:52:52 -07:00
|
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
|
|
|
;; This package provides the grep facilities documented in the Emacs
|
|
|
|
;; user's manual.
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
Explicitly require cl-lib where needed
Rather than relying on the byte-compiler happening to use it.
* lisp/completion.el, lisp/ffap.el, lisp/loadhist.el:
* lisp/userlock.el, lisp/emacs-lisp/debug.el, lisp/emacs-lisp/rx.el:
* lisp/emacs-lisp/testcover.el, lisp/mail/rfc2231.el:
* lisp/net/newst-treeview.el, lisp/net/puny.el:
* lisp/net/tramp-archive.el, lisp/net/tramp-gvfs.el:
* lisp/net/tramp-sh.el, lisp/net/tramp-smb.el, lisp/org/org-ctags.el:
* lisp/org/org-macs.el, lisp/progmodes/grep.el:
* lisp/progmodes/perl-mode.el, lisp/progmodes/ruby-mode.el:
* lisp/textmodes/dns-mode.el, lisp/textmodes/mhtml-mode.el:
* lisp/vc/pcvs-parse.el: Explicitly require cl-lib as needed.
2018-03-16 20:41:17 -04:00
|
|
|
(eval-when-compile (require 'cl-lib))
|
2003-11-23 20:56:10 +00:00
|
|
|
(require 'compile)
|
|
|
|
|
|
|
|
(defgroup grep nil
|
2011-05-08 01:17:17 -04:00
|
|
|
"Run `grep' and display the results."
|
2003-11-23 20:56:10 +00:00
|
|
|
:group 'tools
|
|
|
|
:group 'processes)
|
|
|
|
|
2009-05-23 00:11:53 +00:00
|
|
|
(defvar grep-host-defaults-alist nil
|
|
|
|
"Default values depending on target host.
|
|
|
|
`grep-compute-defaults' returns default values for every local or
|
|
|
|
remote host `grep' runs. These values can differ from host to
|
|
|
|
host. Once computed, the default values are kept here in order
|
|
|
|
to avoid computing them again.")
|
|
|
|
|
|
|
|
(defun grep-apply-setting (symbol value)
|
|
|
|
"Set SYMBOL to VALUE, and update `grep-host-defaults-alist'.
|
|
|
|
SYMBOL should be one of `grep-command', `grep-template',
|
2016-09-13 20:48:09 -04:00
|
|
|
`grep-use-null-device', `grep-find-command' `grep-find-template',
|
|
|
|
`grep-find-use-xargs', `grep-use-null-filename-separator', or
|
2009-05-23 00:11:53 +00:00
|
|
|
`grep-highlight-matches'."
|
|
|
|
(when grep-host-defaults-alist
|
|
|
|
(let* ((host-id
|
|
|
|
(intern (or (file-remote-p default-directory) "localhost")))
|
|
|
|
(host-defaults (assq host-id grep-host-defaults-alist))
|
|
|
|
(defaults (assq nil grep-host-defaults-alist)))
|
|
|
|
(setcar (cdr (assq symbol host-defaults)) value)
|
|
|
|
(setcar (cdr (assq symbol defaults)) value)))
|
|
|
|
(set-default symbol value))
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defcustom grep-window-height nil
|
2012-04-09 21:05:48 +08:00
|
|
|
"Number of lines in a grep window. If nil, use `compilation-window-height'."
|
2003-11-23 20:56:10 +00:00
|
|
|
:type '(choice (const :tag "Default" nil)
|
|
|
|
integer)
|
2020-01-21 09:16:25 -05:00
|
|
|
:version "22.1")
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2004-09-07 03:56:35 +00:00
|
|
|
(defcustom grep-highlight-matches 'auto-detect
|
2009-11-25 17:23:45 +00:00
|
|
|
"Use special markers to highlight grep matches.
|
2004-09-02 16:35:42 +00:00
|
|
|
|
|
|
|
Some grep programs are able to surround matches with special
|
|
|
|
markers in grep output. Such markers can be used to highlight
|
2011-03-02 22:39:11 -08:00
|
|
|
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.
|
2004-09-02 16:35:42 +00:00
|
|
|
|
2009-11-25 17:23:45 +00:00
|
|
|
This option sets the environment variable GREP_COLORS to specify
|
2014-09-16 17:07:12 -07:00
|
|
|
markers for highlighting and adds the --color option in front of
|
|
|
|
any explicit grep options before starting the grep.
|
2004-09-07 18:10:49 +00:00
|
|
|
|
2014-09-16 17:07:12 -07:00
|
|
|
When this option is `auto', grep uses `--color' to highlight
|
2009-11-25 17:23:45 +00:00
|
|
|
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.
|
|
|
|
|
|
|
|
To make grep highlight matches even into a pipe, you need the option
|
|
|
|
`always' that forces grep to use `--color=always' to unconditionally
|
|
|
|
output escape sequences.
|
|
|
|
|
2009-05-23 00:11:53 +00:00
|
|
|
In interactive usage, the actual value of this variable is set up
|
2009-11-25 17:23:45 +00:00
|
|
|
by `grep-compute-defaults' when the default value is `auto-detect'.
|
2019-10-11 22:13:43 +02:00
|
|
|
To change the default value, use \\[customize] or call the function
|
2009-11-25 17:23:45 +00:00
|
|
|
`grep-apply-setting'."
|
2004-09-07 03:56:35 +00:00
|
|
|
:type '(choice (const :tag "Do not highlight matches with grep markers" nil)
|
|
|
|
(const :tag "Highlight matches with grep markers" t)
|
2009-11-25 17:23:45 +00:00
|
|
|
(const :tag "Use --color=always" always)
|
2014-09-16 17:07:12 -07:00
|
|
|
(const :tag "Use --color" auto)
|
2004-09-07 03:56:35 +00:00
|
|
|
(other :tag "Not Set" auto-detect))
|
2020-01-21 09:16:25 -05:00
|
|
|
:set #'grep-apply-setting
|
|
|
|
:version "22.1")
|
2004-09-02 16:35:42 +00:00
|
|
|
|
2020-09-27 14:55:22 +02:00
|
|
|
(defcustom grep-match-regexp "\033\\[0?1;31m\\(.*?\\)\033\\[[0-9]*m"
|
|
|
|
"Regular expression matching grep markers to highlight.
|
|
|
|
It matches SGR ANSI escape sequences which are emitted by grep to
|
|
|
|
color its output. This variable is used in `grep-filter'."
|
|
|
|
:type 'regexp
|
|
|
|
:version "28.1")
|
|
|
|
|
2003-11-23 20:56:10 +00:00
|
|
|
(defcustom grep-scroll-output nil
|
2012-04-09 21:05:48 +08:00
|
|
|
"Non-nil to scroll the *grep* buffer window as output appears.
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
Setting it causes the grep commands to put point at the end of their
|
|
|
|
output window so that the end of the output is always visible rather
|
2011-12-11 21:32:49 -08:00
|
|
|
than the beginning."
|
2003-11-23 20:56:10 +00:00
|
|
|
:type 'boolean
|
2020-01-21 09:16:25 -05:00
|
|
|
:version "22.1")
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2004-07-03 10:06:42 +00:00
|
|
|
;;;###autoload
|
2003-11-23 20:56:10 +00:00
|
|
|
(defcustom grep-command nil
|
|
|
|
"The default grep command for \\[grep].
|
|
|
|
If the grep program used supports an option to always include file names
|
|
|
|
in its output (such as the `-H' option to GNU grep), it's a good idea to
|
|
|
|
include it when specifying `grep-command'.
|
|
|
|
|
2009-05-23 00:11:53 +00:00
|
|
|
In interactive usage, the actual value of this variable is set up
|
|
|
|
by `grep-compute-defaults'; to change the default value, use
|
2019-10-11 22:13:43 +02:00
|
|
|
\\[customize] or call the function `grep-apply-setting'."
|
2003-11-23 20:56:10 +00:00
|
|
|
:type '(choice string
|
|
|
|
(const :tag "Not Set" nil))
|
2020-01-21 09:16:25 -05:00
|
|
|
:set #'grep-apply-setting)
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2006-04-28 22:22:01 +00:00
|
|
|
(defcustom grep-template nil
|
|
|
|
"The default command to run for \\[lgrep].
|
|
|
|
The following place holders should be present in the string:
|
2015-06-26 20:21:50 +03:00
|
|
|
<C> - place to put the options like -i and --color.
|
2006-04-28 22:22:01 +00:00
|
|
|
<F> - file names and wildcards to search.
|
2009-09-10 00:58:15 +00:00
|
|
|
<X> - file names and wildcards to exclude.
|
2006-04-28 22:22:01 +00:00
|
|
|
<R> - the regular expression searched for.
|
2009-05-23 00:11:53 +00:00
|
|
|
<N> - place to insert null-device.
|
|
|
|
|
|
|
|
In interactive usage, the actual value of this variable is set up
|
|
|
|
by `grep-compute-defaults'; to change the default value, use
|
2019-10-11 22:13:43 +02:00
|
|
|
\\[customize] or call the function `grep-apply-setting'."
|
2006-04-28 22:22:01 +00:00
|
|
|
:type '(choice string
|
|
|
|
(const :tag "Not Set" nil))
|
2020-01-21 09:16:25 -05:00
|
|
|
:set #'grep-apply-setting
|
|
|
|
:version "22.1")
|
2006-04-28 22:22:01 +00:00
|
|
|
|
2003-11-23 20:56:10 +00:00
|
|
|
(defcustom grep-use-null-device 'auto-detect
|
|
|
|
"If t, append the value of `null-device' to `grep' commands.
|
|
|
|
This is done to ensure that the output of grep includes the filename of
|
|
|
|
any match in the case where only a single file is searched, and is not
|
|
|
|
necessary if the grep program used supports the `-H' option.
|
|
|
|
|
2009-05-23 00:11:53 +00:00
|
|
|
In interactive usage, the actual value of this variable is set up
|
|
|
|
by `grep-compute-defaults'; to change the default value, use
|
2019-10-11 22:13:43 +02:00
|
|
|
\\[customize] or call the function `grep-apply-setting'."
|
2003-11-23 20:56:10 +00:00
|
|
|
:type '(choice (const :tag "Do Not Append Null Device" nil)
|
|
|
|
(const :tag "Append Null Device" t)
|
|
|
|
(other :tag "Not Set" auto-detect))
|
2020-01-21 09:16:25 -05:00
|
|
|
:set #'grep-apply-setting)
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2016-09-13 20:48:09 -04:00
|
|
|
(defcustom grep-use-null-filename-separator 'auto-detect
|
|
|
|
"If non-nil, use `grep's `--null' option.
|
|
|
|
This is done to disambiguate file names in `grep's output."
|
2017-12-12 23:21:24 -08:00
|
|
|
:version "26.1"
|
2016-09-13 20:48:09 -04:00
|
|
|
:type '(choice (const :tag "Do Not Use `--null'" nil)
|
|
|
|
(const :tag "Use `--null'" t)
|
|
|
|
(other :tag "Not Set" auto-detect))
|
2020-01-21 09:16:25 -05:00
|
|
|
:set #'grep-apply-setting)
|
2016-09-13 20:48:09 -04:00
|
|
|
|
2004-07-03 10:06:42 +00:00
|
|
|
;;;###autoload
|
2003-11-23 20:56:10 +00:00
|
|
|
(defcustom grep-find-command nil
|
|
|
|
"The default find command for \\[grep-find].
|
2009-05-23 00:11:53 +00:00
|
|
|
In interactive usage, the actual value of this variable is set up
|
|
|
|
by `grep-compute-defaults'; to change the default value, use
|
2020-08-22 16:27:17 +02:00
|
|
|
\\[customize] or call the function `grep-apply-setting'.
|
|
|
|
|
2020-08-22 18:57:57 +03:00
|
|
|
This variable can either be a string, or a cons of the
|
2020-08-22 16:27:17 +02:00
|
|
|
form (COMMAND . POSITION). In the latter case, COMMAND will be
|
2020-08-22 18:57:57 +03:00
|
|
|
used as the default command, and point will be placed at POSITION
|
2020-08-22 16:27:17 +02:00
|
|
|
for easier editing."
|
2003-11-23 20:56:10 +00:00
|
|
|
:type '(choice string
|
2020-08-22 16:27:17 +02:00
|
|
|
(cons string integer)
|
2003-11-23 20:56:10 +00:00
|
|
|
(const :tag "Not Set" nil))
|
2020-01-21 09:16:25 -05:00
|
|
|
:set #'grep-apply-setting)
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2006-04-28 22:22:01 +00:00
|
|
|
(defcustom grep-find-template nil
|
|
|
|
"The default command to run for \\[rgrep].
|
2003-11-23 20:56:10 +00:00
|
|
|
The following place holders should be present in the string:
|
|
|
|
<D> - base directory for find
|
|
|
|
<X> - find options to restrict or expand the directory list
|
|
|
|
<F> - find options to limit the files matched
|
2015-06-26 20:21:50 +03:00
|
|
|
<C> - place to put the grep options like -i and --color
|
2009-05-23 00:11:53 +00:00
|
|
|
<R> - the regular expression searched for.
|
|
|
|
In interactive usage, the actual value of this variable is set up
|
|
|
|
by `grep-compute-defaults'; to change the default value, use
|
2019-10-11 22:13:43 +02:00
|
|
|
\\[customize] or call the function `grep-apply-setting'."
|
2003-11-23 20:56:10 +00:00
|
|
|
:type '(choice string
|
|
|
|
(const :tag "Not Set" nil))
|
2020-01-21 09:16:25 -05:00
|
|
|
:set #'grep-apply-setting
|
|
|
|
:version "22.1")
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2007-08-30 09:37:33 +00:00
|
|
|
(defcustom grep-files-aliases
|
2016-02-14 16:14:33 +01:00
|
|
|
'(("all" . "* .[!.]* ..?*") ;; Don't match `..'. See bug#22577
|
2009-09-10 00:58:15 +00:00
|
|
|
("el" . "*.el")
|
|
|
|
("ch" . "*.[ch]")
|
2007-08-30 09:37:33 +00:00
|
|
|
("c" . "*.c")
|
2008-07-11 02:44:10 +00:00
|
|
|
("cc" . "*.cc *.cxx *.cpp *.C *.CC *.c++")
|
2009-09-10 00:58:15 +00:00
|
|
|
("cchh" . "*.cc *.[ch]xx *.[ch]pp *.[CHh] *.CC *.HH *.[ch]++")
|
2008-07-11 02:44:10 +00:00
|
|
|
("hh" . "*.hxx *.hpp *.[Hh] *.HH *.h++")
|
2007-08-30 09:37:33 +00:00
|
|
|
("h" . "*.h")
|
2009-09-10 00:58:15 +00:00
|
|
|
("l" . "[Cc]hange[Ll]og*")
|
2007-08-30 09:37:33 +00:00
|
|
|
("m" . "[Mm]akefile*")
|
2009-09-10 00:58:15 +00:00
|
|
|
("tex" . "*.tex")
|
|
|
|
("texi" . "*.texi")
|
|
|
|
("asm" . "*.[sS]"))
|
2012-04-09 21:05:48 +08:00
|
|
|
"Alist of aliases for the FILES argument to `lgrep' and `rgrep'."
|
2020-01-21 09:16:25 -05:00
|
|
|
:type 'alist)
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2019-10-11 22:13:43 +02:00
|
|
|
(defcustom grep-find-ignored-directories vc-directory-exclusion-list
|
2012-04-09 21:05:48 +08:00
|
|
|
"List of names of sub-directories which `rgrep' shall not recurse into.
|
2009-07-08 14:23:57 +00:00
|
|
|
If an element is a cons cell, the car is called on the search directory
|
2019-10-11 22:13:43 +02:00
|
|
|
to determine whether cdr should not be recursed into.
|
|
|
|
|
|
|
|
The default value is inherited from `vc-directory-exclusion-list'."
|
2009-09-10 00:58:15 +00:00
|
|
|
:type '(choice (repeat :tag "Ignored directories" string)
|
2020-01-21 09:16:25 -05:00
|
|
|
(const :tag "No ignored directories" nil)))
|
2009-09-10 00:58:15 +00:00
|
|
|
|
|
|
|
(defcustom grep-find-ignored-files
|
|
|
|
(cons ".#*" (delq nil (mapcar (lambda (s)
|
|
|
|
(unless (string-match-p "/\\'" s)
|
|
|
|
(concat "*" s)))
|
|
|
|
completion-ignored-extensions)))
|
2012-04-09 21:05:48 +08:00
|
|
|
"List of file names which `rgrep' and `lgrep' shall exclude.
|
2009-09-10 00:58:15 +00:00
|
|
|
If an element is a cons cell, the car is called on the search directory
|
|
|
|
to determine whether cdr should not be excluded."
|
|
|
|
:type '(choice (repeat :tag "Ignored file" string)
|
2020-01-21 09:16:25 -05:00
|
|
|
(const :tag "No ignored files" nil)))
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2016-02-29 16:20:05 +11:00
|
|
|
(defcustom grep-save-buffers 'ask
|
|
|
|
"If non-nil, save buffers before running the grep commands.
|
2016-02-29 08:51:12 -08:00
|
|
|
If `ask', ask before saving. If a function, call it with no arguments
|
|
|
|
with each buffer current, as a predicate to determine whether that
|
|
|
|
buffer should be saved or not. E.g., one can set this to
|
2016-02-29 16:20:05 +11:00
|
|
|
(lambda ()
|
|
|
|
(string-prefix-p my-grep-root (file-truename (buffer-file-name))))
|
|
|
|
to limit saving to files located under `my-grep-root'."
|
2016-11-17 00:39:43 +09:00
|
|
|
:version "26.1"
|
2016-02-29 16:20:05 +11:00
|
|
|
:type '(choice
|
2016-02-29 08:51:12 -08:00
|
|
|
(const :tag "Ask before saving" ask)
|
2016-02-29 16:20:05 +11:00
|
|
|
(const :tag "Don't save buffers" nil)
|
2016-02-29 08:51:12 -08:00
|
|
|
function
|
2020-01-21 09:16:25 -05:00
|
|
|
(other :tag "Save all buffers" t)))
|
2016-02-29 16:20:05 +11:00
|
|
|
|
2004-06-23 23:11:23 +00:00
|
|
|
(defcustom grep-error-screen-columns nil
|
2012-04-09 21:05:48 +08:00
|
|
|
"If non-nil, column numbers in grep hits are screen columns.
|
lisp/*.el: Fix typos and other trivial doc fixes
* lisp/allout-widgets.el (allout-widgets-auto-activation)
(allout-current-decorated-p):
* lisp/auth-source.el (auth-source-protocols):
* lisp/autorevert.el (auto-revert-set-timer):
* lisp/battery.el (battery-mode-line-limit):
* lisp/calc/calcalg3.el (math-map-binop):
* lisp/calendar/cal-dst.el (calendar-dst-find-startend):
* lisp/calendar/cal-mayan.el (calendar-mayan-long-count-to-absolute):
* lisp/calendar/calendar.el (calendar-date-echo-text)
(calendar-generate-month, calendar-string-spread)
(calendar-cursor-to-date, calendar-read, calendar-read-date)
(calendar-mark-visible-date, calendar-dayname-on-or-before):
* lisp/calendar/diary-lib.el (diary-ordinal-suffix):
* lisp/cedet/ede/autoconf-edit.el (autoconf-new-program)
(autoconf-find-last-macro, autoconf-parameter-strip):
* lisp/cedet/ede/config.el (ede-target-with-config-build):
* lisp/cedet/ede/linux.el (ede-linux--detect-architecture)
(ede-linux--get-architecture):
* lisp/cedet/semantic/complete.el (semantic-collector-calculate-cache)
(semantic-displayer-abstract, semantic-displayer-point-position):
* lisp/cedet/semantic/format.el (semantic-format-face-alist)
(semantic-format-tag-short-doc):
* lisp/cedet/semantic/fw.el (semantic-find-file-noselect):
* lisp/cedet/semantic/idle.el (semantic-idle-scheduler-work-idle-time)
(semantic-idle-breadcrumbs-display-function)
(semantic-idle-breadcrumbs-format-tag-list-function):
* lisp/cedet/semantic/lex.el (semantic-lex-map-types)
(define-lex, define-lex-block-type-analyzer):
* lisp/cedet/semantic/senator.el (senator-search-default-tag-filter):
* lisp/cedet/semantic/symref.el (semantic-symref-result)
(semantic-symref-hit-to-tag-via-db):
* lisp/cedet/semantic/symref.el (semantic-symref-tool-baseclass):
* lisp/cedet/semantic/tag.el (semantic-tag-new-variable)
(semantic-tag-new-include, semantic-tag-new-package)
(semantic-tag-set-faux, semantic-create-tag-proxy)
(semantic-tag-function-parent)
(semantic-tag-components-with-overlays):
* lisp/cedet/srecode/cpp.el (srecode-cpp-namespaces)
(srecode-semantic-handle-:c, srecode-semantic-apply-tag-to-dict):
* lisp/cedet/srecode/dictionary.el (srecode-create-dictionary)
(srecode-dictionary-add-entries, srecode-dictionary-lookup-name)
(srecode-create-dictionaries-from-tags):
* lisp/cmuscheme.el (scheme-compile-region):
* lisp/color.el (color-lab-to-lch):
* lisp/doc-view.el (doc-view-image-width)
(doc-view-set-up-single-converter):
* lisp/dynamic-setting.el (font-setting-change-default-font)
(dynamic-setting-handle-config-changed-event):
* lisp/elec-pair.el (electric-pair-text-pairs)
(electric-pair-skip-whitespace-function)
(electric-pair-string-bound-function):
* lisp/emacs-lisp/avl-tree.el (avl-tree--del-balance)
(avl-tree-member, avl-tree-mapcar, avl-tree-iter):
* lisp/emacs-lisp/bytecomp.el (byte-compile-generate-call-tree):
* lisp/emacs-lisp/checkdoc.el (checkdoc-autofix-flag)
(checkdoc-spellcheck-documentation-flag, checkdoc-ispell)
(checkdoc-ispell-current-buffer, checkdoc-ispell-interactive)
(checkdoc-ispell-message-interactive)
(checkdoc-ispell-message-text, checkdoc-ispell-start)
(checkdoc-ispell-continue, checkdoc-ispell-comments)
(checkdoc-ispell-defun):
* lisp/emacs-lisp/cl-generic.el (cl--generic-search-method):
* lisp/emacs-lisp/eieio-custom.el (eieio-read-customization-group):
* lisp/emacs-lisp/lisp.el (forward-sexp, up-list):
* lisp/emacs-lisp/package-x.el (package--archive-contents-from-file):
* lisp/emacs-lisp/package.el (package-desc)
(package--make-autoloads-and-stuff, package-hidden-regexps):
* lisp/emacs-lisp/tcover-ses.el (ses-exercise-startup):
* lisp/emacs-lisp/testcover.el (testcover-nohits)
(testcover-1value):
* lisp/epg.el (epg-receive-keys, epg-start-edit-key):
* lisp/erc/erc-backend.el (erc-server-processing-p)
(erc-split-line-length, erc-server-coding-system)
(erc-server-send, erc-message):
* lisp/erc/erc-button.el (erc-button-face, erc-button-alist)
(erc-browse-emacswiki):
* lisp/erc/erc-ezbounce.el (erc-ezbounce, erc-ezb-get-login):
* lisp/erc/erc-fill.el (erc-fill-variable-maximum-indentation):
* lisp/erc/erc-log.el (erc-current-logfile):
* lisp/erc/erc-match.el (erc-log-match-format)
(erc-text-matched-hook):
* lisp/erc/erc-netsplit.el (erc-netsplit, erc-netsplit-debug):
* lisp/erc/erc-networks.el (erc-server-alist)
(erc-networks-alist, erc-current-network):
* lisp/erc/erc-ring.el (erc-input-ring-index):
* lisp/erc/erc-speedbar.el (erc-speedbar)
(erc-speedbar-update-channel):
* lisp/erc/erc-stamp.el (erc-timestamp-only-if-changed-flag):
* lisp/erc/erc-track.el (erc-track-position-in-mode-line)
(erc-track-remove-from-mode-line, erc-modified-channels-update)
(erc-track-last-non-erc-buffer, erc-track-sort-by-importance)
(erc-track-get-active-buffer):
* lisp/erc/erc.el (erc-get-channel-user-list)
(erc-echo-notice-hook, erc-echo-notice-always-hook)
(erc-wash-quit-reason, erc-format-@nick):
* lisp/ffap.el (ffap-latex-mode):
* lisp/files.el (abort-if-file-too-large)
(dir-locals--get-sort-score, buffer-stale--default-function):
* lisp/filesets.el (filesets-tree-max-level, filesets-data)
(filesets-update-pre010505):
* lisp/gnus/gnus-agent.el (gnus-agent-flush-cache):
* lisp/gnus/gnus-art.el (gnus-article-encrypt-protocol)
(gnus-button-prefer-mid-or-mail):
* lisp/gnus/gnus-cus.el (gnus-group-parameters):
* lisp/gnus/gnus-demon.el (gnus-demon-handlers)
(gnus-demon-run-callback):
* lisp/gnus/gnus-dired.el (gnus-dired-print):
* lisp/gnus/gnus-icalendar.el (gnus-icalendar-event-from-buffer):
* lisp/gnus/gnus-range.el (gnus-range-normalize):
* lisp/gnus/gnus-spec.el (gnus-pad-form):
* lisp/gnus/gnus-srvr.el (gnus-server-agent, gnus-server-cloud)
(gnus-server-opened, gnus-server-closed, gnus-server-denied)
(gnus-server-offline):
* lisp/gnus/gnus-sum.el (gnus-refer-thread-use-nnir)
(gnus-refer-thread-limit-to-thread)
(gnus-summary-limit-include-thread, gnus-summary-refer-thread)
(gnus-summary-find-matching):
* lisp/gnus/gnus-util.el (gnus-rescale-image):
* lisp/gnus/gnus.el (gnus-summary-line-format, gnus-no-server):
* lisp/gnus/mail-source.el (mail-source-incoming-file-prefix):
* lisp/gnus/message.el (message-cite-reply-position)
(message-cite-style-outlook, message-cite-style-thunderbird)
(message-cite-style-gmail, message--send-mail-maybe-partially):
* lisp/gnus/mm-extern.el (mm-inline-external-body):
* lisp/gnus/mm-partial.el (mm-inline-partial):
* lisp/gnus/mml-sec.el (mml-secure-message-sign)
(mml-secure-message-sign-encrypt, mml-secure-message-encrypt):
* lisp/gnus/mml2015.el (mml2015-epg-key-image)
(mml2015-epg-key-image-to-string):
* lisp/gnus/nndiary.el (nndiary-reminders, nndiary-get-new-mail):
* lisp/gnus/nnheader.el (nnheader-directory-files-is-safe):
* lisp/gnus/nnir.el (nnir-search-history)
(nnir-imap-search-other, nnir-artlist-length)
(nnir-artlist-article, nnir-artitem-group, nnir-artitem-number)
(nnir-artitem-rsv, nnir-article-group, nnir-article-number)
(nnir-article-rsv, nnir-article-ids, nnir-categorize)
(nnir-retrieve-headers-override-function)
(nnir-imap-default-search-key, nnir-hyrex-additional-switches)
(gnus-group-make-nnir-group, nnir-run-namazu, nnir-read-parms)
(nnir-read-parm, nnir-read-server-parm, nnir-search-thread):
* lisp/gnus/nnmairix.el (nnmairix-default-group)
(nnmairix-propagate-marks):
* lisp/gnus/smime.el (smime-keys, smime-crl-check)
(smime-verify-buffer, smime-noverify-buffer):
* lisp/gnus/spam-report.el (spam-report-url-ping-mm-url):
* lisp/gnus/spam.el (spam-spamassassin-positive-spam-flag-header)
(spam-spamassassin-spam-status-header, spam-sa-learn-rebuild)
(spam-classifications, spam-check-stat, spam-spamassassin-score):
* lisp/help.el (describe-minor-mode-from-symbol):
* lisp/hippie-exp.el (hippie-expand-ignore-buffers):
* lisp/htmlfontify.el (hfy-optimizations, hfy-face-resolve-face)
(hfy-begin-span):
* lisp/ibuf-ext.el (ibuffer-update-saved-filters-format)
(ibuffer-saved-filters, ibuffer-old-saved-filters-warning)
(ibuffer-filtering-qualifiers, ibuffer-repair-saved-filters)
(eval, ibuffer-unary-operand, file-extension, directory):
* lisp/image-dired.el (image-dired-cmd-pngcrush-options):
* lisp/image-mode.el (image-toggle-display):
* lisp/international/ccl.el (ccl-compile-read-multibyte-character)
(ccl-compile-write-multibyte-character):
* lisp/international/kkc.el (kkc-save-init-file):
* lisp/international/latin1-disp.el (latin1-display):
* lisp/international/ogonek.el (ogonek-name-encoding-alist)
(ogonek-information, ogonek-lookup-encoding)
(ogonek-deprefixify-region):
* lisp/isearch.el (isearch-filter-predicate)
(isearch--momentary-message):
* lisp/jsonrpc.el (jsonrpc-connection-send)
(jsonrpc-process-connection, jsonrpc-shutdown)
(jsonrpc--async-request-1):
* lisp/language/tibet-util.el (tibetan-char-p):
* lisp/mail/feedmail.el (feedmail-queue-use-send-time-for-date)
(feedmail-last-chance-hook, feedmail-before-fcc-hook)
(feedmail-send-it-immediately-wrapper, feedmail-find-eoh):
* lisp/mail/hashcash.el (hashcash-generate-payment)
(hashcash-generate-payment-async, hashcash-insert-payment)
(hashcash-verify-payment):
* lisp/mail/rmail.el (rmail-movemail-variant-in-use)
(rmail-get-attr-value):
* lisp/mail/rmailmm.el (rmail-mime-prefer-html, rmail-mime):
* lisp/mail/rmailsum.el (rmail-summary-show-message):
* lisp/mail/supercite.el (sc-raw-mode-toggle):
* lisp/man.el (Man-start-calling):
* lisp/mh-e/mh-acros.el (mh-do-at-event-location)
(mh-iterate-on-messages-in-region, mh-iterate-on-range):
* lisp/mh-e/mh-alias.el (mh-alias-system-aliases)
(mh-alias-reload, mh-alias-ali)
(mh-alias-canonicalize-suggestion, mh-alias-add-alias-to-file)
(mh-alias-add-alias):
* lisp/mouse.el (mouse-save-then-kill):
* lisp/net/browse-url.el (browse-url-default-macosx-browser):
* lisp/net/eudc.el (eudc-set, eudc-variable-protocol-value)
(eudc-variable-server-value, eudc-update-variable)
(eudc-expand-inline):
* lisp/net/eudcb-bbdb.el (eudc-bbdb-format-record-as-result):
* lisp/net/eudcb-ldap.el (eudc-ldap-get-field-list):
* lisp/net/pop3.el (pop3-list):
* lisp/net/soap-client.el (soap-namespace-put)
(soap-xs-parse-sequence, soap-parse-envelope):
* lisp/net/soap-inspect.el (soap-inspect-xs-complex-type):
* lisp/nxml/rng-xsd.el (rng-xsd-date-to-days):
* lisp/org/ob-C.el (org-babel-prep-session:C)
(org-babel-load-session:C):
* lisp/org/ob-J.el (org-babel-execute:J):
* lisp/org/ob-asymptote.el (org-babel-prep-session:asymptote):
* lisp/org/ob-awk.el (org-babel-execute:awk):
* lisp/org/ob-core.el (org-babel-process-file-name):
* lisp/org/ob-ebnf.el (org-babel-execute:ebnf):
* lisp/org/ob-forth.el (org-babel-execute:forth):
* lisp/org/ob-fortran.el (org-babel-execute:fortran)
(org-babel-prep-session:fortran, org-babel-load-session:fortran):
* lisp/org/ob-groovy.el (org-babel-execute:groovy):
* lisp/org/ob-io.el (org-babel-execute:io):
* lisp/org/ob-js.el (org-babel-execute:js):
* lisp/org/ob-lilypond.el (org-babel-default-header-args:lilypond)
(org-babel-lilypond-compile-post-tangle)
(org-babel-lilypond-display-pdf-post-tangle)
(org-babel-lilypond-tangle)
(org-babel-lilypond-execute-tangled-ly)
(org-babel-lilypond-compile-lilyfile)
(org-babel-lilypond-check-for-compile-error)
(org-babel-lilypond-process-compile-error)
(org-babel-lilypond-mark-error-line)
(org-babel-lilypond-parse-error-line)
(org-babel-lilypond-attempt-to-open-pdf)
(org-babel-lilypond-attempt-to-play-midi)
(org-babel-lilypond-switch-extension)
(org-babel-lilypond-set-header-args):
* lisp/org/ob-lua.el (org-babel-prep-session:lua):
* lisp/org/ob-picolisp.el (org-babel-execute:picolisp):
* lisp/org/ob-processing.el (org-babel-prep-session:processing):
* lisp/org/ob-python.el (org-babel-prep-session:python):
* lisp/org/ob-scheme.el (org-babel-scheme-capture-current-message)
(org-babel-scheme-execute-with-geiser, org-babel-execute:scheme):
* lisp/org/ob-shen.el (org-babel-execute:shen):
* lisp/org/org-agenda.el (org-agenda-entry-types)
(org-agenda-move-date-from-past-immediately-to-today)
(org-agenda-time-grid, org-agenda-sorting-strategy)
(org-agenda-filter-by-category, org-agenda-forward-block):
* lisp/org/org-colview.el (org-columns--overlay-text):
* lisp/org/org-faces.el (org-verbatim, org-cycle-level-faces):
* lisp/org/org-indent.el (org-indent-set-line-properties):
* lisp/org/org-macs.el (org-get-limited-outline-regexp):
* lisp/org/org-mobile.el (org-mobile-files):
* lisp/org/org.el (org-use-fast-todo-selection)
(org-extend-today-until, org-use-property-inheritance)
(org-refresh-effort-properties, org-open-at-point-global)
(org-track-ordered-property-with-tag, org-shiftright):
* lisp/org/ox-html.el (org-html-checkbox-type):
* lisp/org/ox-man.el (org-man-source-highlight)
(org-man-verse-block):
* lisp/org/ox-publish.el (org-publish-sitemap-default):
* lisp/outline.el (outline-head-from-level):
* lisp/progmodes/dcl-mode.el (dcl-back-to-indentation-1)
(dcl-calc-command-indent, dcl-indent-to):
* lisp/progmodes/flymake.el (flymake-make-diagnostic)
(flymake--overlays, flymake-diagnostic-functions)
(flymake-diagnostic-types-alist, flymake--backend-state)
(flymake-is-running, flymake--collect, flymake-mode):
* lisp/progmodes/gdb-mi.el (gdb-threads-list, gdb, gdb-non-stop)
(gdb-buffers, gdb-gud-context-call, gdb-jsonify-buffer):
* lisp/progmodes/grep.el (grep-error-screen-columns):
* lisp/progmodes/gud.el (gud-prev-expr):
* lisp/progmodes/ps-mode.el (ps-mode, ps-mode-target-column)
(ps-run-goto-error):
* lisp/progmodes/python.el (python-eldoc-get-doc)
(python-eldoc-function-timeout-permanent, python-eldoc-function):
* lisp/shadowfile.el (shadow-make-group):
* lisp/speedbar.el (speedbar-obj-do-check):
* lisp/textmodes/flyspell.el (flyspell-auto-correct-previous-hook):
* lisp/textmodes/reftex-cite.el (reftex-bib-or-thebib):
* lisp/textmodes/reftex-index.el (reftex-index-goto-entry)
(reftex-index-kill, reftex-index-undo):
* lisp/textmodes/reftex-parse.el (reftex-context-substring):
* lisp/textmodes/reftex.el (reftex-TeX-master-file):
* lisp/textmodes/rst.el (rst-next-hdr, rst-toc)
(rst-uncomment-region, rst-font-lock-extend-region-internal):
* lisp/thumbs.el (thumbs-mode):
* lisp/vc/ediff-util.el (ediff-restore-diff):
* lisp/vc/pcvs-defs.el (cvs-cvsroot, cvs-force-dir-tag):
* lisp/vc/vc-hg.el (vc-hg--ignore-patterns-valid-p):
* lisp/wid-edit.el (widget-field-value-set, string):
* lisp/x-dnd.el (x-dnd-version-from-flags)
(x-dnd-more-than-3-from-flags): Assorted docfixes.
2019-09-21 00:27:53 +02:00
|
|
|
See `compilation-error-screen-columns'."
|
2004-06-23 23:11:23 +00:00
|
|
|
:type '(choice (const :tag "Default" nil)
|
|
|
|
integer)
|
2020-01-21 09:16:25 -05:00
|
|
|
:version "22.1")
|
2004-06-23 23:11:23 +00:00
|
|
|
|
2003-11-23 20:56:10 +00:00
|
|
|
;;;###autoload
|
|
|
|
(defcustom grep-setup-hook nil
|
|
|
|
"List of hook functions run by `grep-process-setup' (see `run-hooks')."
|
2020-01-21 09:16:25 -05:00
|
|
|
:type 'hook)
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
(defvar grep-mode-map
|
2008-05-08 17:28:05 +00:00
|
|
|
(let ((map (make-sparse-keymap)))
|
|
|
|
(set-keymap-parent map compilation-minor-mode-map)
|
2011-10-01 16:32:01 -04:00
|
|
|
(define-key map " " 'scroll-up-command)
|
2013-02-11 20:46:18 -08:00
|
|
|
(define-key map [?\S-\ ] 'scroll-down-command)
|
2011-10-01 16:32:01 -04:00
|
|
|
(define-key map "\^?" 'scroll-down-command)
|
2004-09-08 20:21:57 +00:00
|
|
|
(define-key map "\C-c\C-f" 'next-error-follow-minor-mode)
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
(define-key map "\r" 'compile-goto-error) ;; ?
|
|
|
|
(define-key map "n" 'next-error-no-select)
|
|
|
|
(define-key map "p" 'previous-error-no-select)
|
|
|
|
(define-key map "{" 'compilation-previous-file)
|
|
|
|
(define-key map "}" 'compilation-next-file)
|
2005-08-04 01:38:42 +00:00
|
|
|
(define-key map "\t" 'compilation-next-error)
|
|
|
|
(define-key map [backtab] 'compilation-previous-error)
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
;; Set up the menu-bar
|
|
|
|
(define-key map [menu-bar grep]
|
|
|
|
(cons "Grep" (make-sparse-keymap "Grep")))
|
|
|
|
|
2018-03-11 14:56:00 +01:00
|
|
|
(define-key map [menu-bar grep grep-find-toggle-abbreviation]
|
|
|
|
'(menu-item "Toggle command abbreviation"
|
|
|
|
grep-find-toggle-abbreviation
|
|
|
|
:help "Toggle showing verbose command options"))
|
|
|
|
(define-key map [menu-bar grep compilation-separator3] '("----"))
|
2003-11-23 20:56:10 +00:00
|
|
|
(define-key map [menu-bar grep compilation-kill-compilation]
|
2008-03-05 04:09:24 +00:00
|
|
|
'(menu-item "Kill Grep" kill-compilation
|
|
|
|
:help "Kill the currently running grep process"))
|
|
|
|
(define-key map [menu-bar grep compilation-separator2] '("----"))
|
2003-11-23 20:56:10 +00:00
|
|
|
(define-key map [menu-bar grep compilation-compile]
|
2008-03-05 04:09:24 +00:00
|
|
|
'(menu-item "Compile..." compile
|
|
|
|
:help "Compile the program including the current buffer. Default: run `make'"))
|
2009-01-25 00:55:22 +00:00
|
|
|
(define-key map [menu-bar grep compilation-rgrep]
|
|
|
|
'(menu-item "Recursive grep..." rgrep
|
|
|
|
:help "User-friendly recursive grep in directory tree"))
|
|
|
|
(define-key map [menu-bar grep compilation-lgrep]
|
|
|
|
'(menu-item "Local grep..." lgrep
|
|
|
|
:help "User-friendly grep in a directory"))
|
|
|
|
(define-key map [menu-bar grep compilation-grep-find]
|
|
|
|
'(menu-item "Grep via Find..." grep-find
|
|
|
|
:help "Run grep via find, with user-specified args"))
|
2003-11-23 20:56:10 +00:00
|
|
|
(define-key map [menu-bar grep compilation-grep]
|
2008-03-05 04:09:24 +00:00
|
|
|
'(menu-item "Another grep..." grep
|
|
|
|
:help "Run grep, with user-specified args, and collect output in a buffer."))
|
2003-11-23 20:56:10 +00:00
|
|
|
(define-key map [menu-bar grep compilation-recompile]
|
2008-03-05 04:09:24 +00:00
|
|
|
'(menu-item "Repeat grep" recompile
|
|
|
|
:help "Run grep again"))
|
2018-03-11 14:56:00 +01:00
|
|
|
(define-key map [menu-bar grep compilation-separator1] '("----"))
|
2003-11-23 20:56:10 +00:00
|
|
|
(define-key map [menu-bar grep compilation-first-error]
|
2008-03-05 04:09:24 +00:00
|
|
|
'(menu-item "First Match" first-error
|
|
|
|
:help "Restart at the first match, visit corresponding location"))
|
2003-11-23 20:56:10 +00:00
|
|
|
(define-key map [menu-bar grep compilation-previous-error]
|
2008-03-05 04:09:24 +00:00
|
|
|
'(menu-item "Previous Match" previous-error
|
|
|
|
:help "Visit the previous match and corresponding location"))
|
2003-11-23 20:56:10 +00:00
|
|
|
(define-key map [menu-bar grep compilation-next-error]
|
2008-03-05 04:09:24 +00:00
|
|
|
'(menu-item "Next Match" next-error
|
|
|
|
:help "Visit the next match and corresponding location"))
|
2003-11-23 20:56:10 +00:00
|
|
|
map)
|
|
|
|
"Keymap for grep buffers.
|
|
|
|
`compilation-minor-mode-map' is a cdr of this.")
|
|
|
|
|
2008-02-25 10:52:57 +00:00
|
|
|
(defvar grep-mode-tool-bar-map
|
2008-10-12 13:46:13 +00:00
|
|
|
;; When bootstrapping, tool-bar-map is not properly initialized yet,
|
|
|
|
;; so don't do anything.
|
|
|
|
(when (keymapp (butlast tool-bar-map))
|
2020-01-21 09:16:25 -05:00
|
|
|
;; We have to `copy-keymap' rather than use keymap inheritance because
|
|
|
|
;; we want to put the new items at the *end* of the tool-bar.
|
2008-10-12 13:46:13 +00:00
|
|
|
(let ((map (butlast (copy-keymap tool-bar-map)))
|
2020-01-21 09:16:25 -05:00
|
|
|
;; FIXME: Nowadays the last button is not "help" but "search"!
|
2008-10-12 13:46:13 +00:00
|
|
|
(help (last tool-bar-map))) ;; Keep Help last in tool bar
|
|
|
|
(tool-bar-local-item
|
|
|
|
"left-arrow" 'previous-error-no-select 'previous-error-no-select map
|
|
|
|
:rtl "right-arrow"
|
|
|
|
:help "Goto previous match")
|
|
|
|
(tool-bar-local-item
|
|
|
|
"right-arrow" 'next-error-no-select 'next-error-no-select map
|
|
|
|
:rtl "left-arrow"
|
|
|
|
:help "Goto next match")
|
|
|
|
(tool-bar-local-item
|
|
|
|
"cancel" 'kill-compilation 'kill-compilation map
|
|
|
|
:enable '(let ((buffer (compilation-find-buffer)))
|
|
|
|
(get-buffer-process buffer))
|
|
|
|
:help "Stop grep")
|
|
|
|
(tool-bar-local-item
|
|
|
|
"refresh" 'recompile 'recompile map
|
|
|
|
:help "Restart grep")
|
|
|
|
(append map help))))
|
2008-02-25 10:52:57 +00:00
|
|
|
|
2004-03-11 22:56:19 +00:00
|
|
|
(defalias 'kill-grep 'kill-compilation)
|
|
|
|
|
2003-11-23 20:56:10 +00:00
|
|
|
;; override compilation-last-buffer
|
|
|
|
(defvar grep-last-buffer nil
|
|
|
|
"The most recent grep buffer.
|
2006-07-12 16:05:19 +00:00
|
|
|
A grep buffer becomes most recent when you select Grep mode in it.
|
2003-11-23 20:56:10 +00:00
|
|
|
Notice that using \\[next-error] or \\[compile-goto-error] modifies
|
2011-11-14 23:55:13 -08:00
|
|
|
`compilation-last-buffer' rather than `grep-last-buffer'.")
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2019-01-14 23:10:34 +01:00
|
|
|
(defvar grep-match-face 'match
|
|
|
|
"Face name to use for grep matches.")
|
|
|
|
|
2016-09-13 20:48:09 -04:00
|
|
|
;;;###autoload
|
2017-07-30 14:47:05 -04:00
|
|
|
(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.
|
2018-07-09 16:56:47 -04:00
|
|
|
"\\(?1:"
|
|
|
|
"\\(?:[a-zA-Z]:\\)?" ; Allow "C:..." for w32.
|
|
|
|
"[^\n:]+?[^\n/:]\\):[\t ]*\\(?2:[1-9][0-9]*\\)[\t ]*:"
|
2017-07-30 14:47:05 -04:00
|
|
|
"\\)")
|
|
|
|
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)))
|
2019-01-14 23:10:34 +01:00
|
|
|
(mbeg (text-property-any beg end 'font-lock-face grep-match-face)))
|
2017-07-30 14:47:05 -04:00
|
|
|
(when mbeg
|
|
|
|
(- mbeg beg)))))
|
|
|
|
.
|
|
|
|
,(lambda ()
|
|
|
|
(when grep-highlight-matches
|
|
|
|
(let* ((beg (match-end 0))
|
|
|
|
(end (save-excursion (goto-char beg) (line-end-position)))
|
2019-01-14 23:10:34 +01:00
|
|
|
(mbeg (text-property-any beg end 'font-lock-face grep-match-face))
|
2017-07-30 14:47:05 -04:00
|
|
|
(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.")
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2012-01-24 21:01:22 -05:00
|
|
|
(defvar grep-first-column 0 ; bug#10594
|
|
|
|
"Value to use for `compilation-first-column' in grep buffers.")
|
|
|
|
|
2004-03-11 22:56:19 +00:00
|
|
|
(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.")
|
|
|
|
|
2005-08-09 21:37:34 +00:00
|
|
|
(defvar grep-error-face 'compilation-error
|
2004-03-11 22:56:19 +00:00
|
|
|
"Face name to use for grep error messages.")
|
|
|
|
|
2005-08-04 01:11:17 +00:00
|
|
|
(defvar grep-context-face 'shadow
|
|
|
|
"Face name to use for grep context lines.")
|
|
|
|
|
2018-02-12 23:39:28 +02:00
|
|
|
(defvar grep-num-matches-found 0)
|
|
|
|
|
|
|
|
(defconst grep-mode-line-matches
|
|
|
|
`(" [" (:propertize (:eval (int-to-string grep-num-matches-found))
|
|
|
|
face ,grep-hit-face
|
|
|
|
help-echo "Number of matches so far")
|
|
|
|
"]"))
|
|
|
|
|
2018-03-11 14:56:00 +01:00
|
|
|
(defcustom grep-find-abbreviate t
|
2018-02-22 23:51:41 +02:00
|
|
|
"If non-nil, hide part of rgrep/lgrep/zrgrep command line.
|
|
|
|
The hidden part contains a list of ignored directories and files.
|
|
|
|
Clicking on the button-like ellipsis unhides the abbreviated part
|
2018-03-11 14:56:00 +01:00
|
|
|
and reveals the entire command line. The visibility of the
|
|
|
|
abbreviated part can also be toggled with
|
|
|
|
`grep-find-toggle-abbreviation'."
|
2018-02-22 23:51:41 +02:00
|
|
|
:type 'boolean
|
2020-01-21 09:16:25 -05:00
|
|
|
:version "27.1")
|
2018-02-22 23:51:41 +02:00
|
|
|
|
2019-04-25 15:49:38 -07:00
|
|
|
(defcustom grep-search-path '(nil)
|
2019-07-30 11:02:03 -07:00
|
|
|
"List of directories to search for files named in grep messages.
|
|
|
|
Elements should be directory names, not file names of
|
|
|
|
directories. The value nil as an element means the grep messages
|
|
|
|
buffer `default-directory'."
|
2019-04-25 15:49:38 -07:00
|
|
|
:version "27.1"
|
|
|
|
:type '(repeat (choice (const :tag "Default" nil)
|
|
|
|
(string :tag "Directory"))))
|
|
|
|
|
2018-03-11 14:56:00 +01:00
|
|
|
(defvar grep-find-abbreviate-properties
|
2018-02-22 23:51:41 +02:00
|
|
|
(let ((ellipsis (if (char-displayable-p ?…) "[…]" "[...]"))
|
|
|
|
(map (make-sparse-keymap)))
|
|
|
|
(define-key map [down-mouse-2] 'mouse-set-point)
|
2018-03-11 14:56:00 +01:00
|
|
|
(define-key map [mouse-2] 'grep-find-toggle-abbreviation)
|
|
|
|
(define-key map "\C-m" 'grep-find-toggle-abbreviation)
|
2018-02-22 23:51:41 +02:00
|
|
|
`(face nil display ,ellipsis mouse-face highlight
|
|
|
|
help-echo "RET, mouse-2: show unabbreviated command"
|
2018-03-11 14:56:00 +01:00
|
|
|
keymap ,map abbreviated-command t))
|
2018-02-22 23:51:41 +02:00
|
|
|
"Properties of button-like ellipsis on part of rgrep command line.")
|
|
|
|
|
2004-03-11 22:56:19 +00:00
|
|
|
(defvar grep-mode-font-lock-keywords
|
|
|
|
'(;; Command output lines.
|
|
|
|
(": \\(.+\\): \\(?:Permission denied\\|No such \\(?:file or directory\\|device or address\\)\\)$"
|
|
|
|
1 grep-error-face)
|
|
|
|
;; remove match from grep-regexp-alist before fontifying
|
Fix regular-expression glitches and typos
Problems reported by Mattias Engdegård in:
https://lists.gnu.org/r/emacs-devel/2019-03/msg00085.html
* admin/admin.el (set-version):
* lisp/allout.el (allout-latexify-one-item):
* lisp/arc-mode.el (archive-arc-rename-entry)
(archive-rar-summarize):
* lisp/calc/calc-graph.el (calc-graph-set-styles)
(calc-graph-hide):
* lisp/calc/calc-help.el (calc-describe-key):
* lisp/calc/calc-lang.el (math-compose-tex-func, eqn):
* lisp/calc/calc.el (calcDigit-key):
* lisp/cedet/ede/makefile-edit.el (makefile-macro-file-list):
* lisp/cedet/ede/speedbar.el (ede-tag-expand):
* lisp/cedet/semantic/sb.el (semantic-sb-show-extra)
(semantic-sb-expand-group):
* lisp/comint.el (comint-substitute-in-file-name):
* lisp/dired.el (dired-actual-switches):
* lisp/emacs-lisp/chart.el (chart-rmail-from):
* lisp/emacs-lisp/eieio-opt.el (eieio-sb-expand):
* lisp/emacs-lisp/eieio-speedbar.el (eieio-speedbar-object-expand):
* lisp/emacs-lisp/rx.el (rx-not, rx-atomic-p):
* lisp/emulation/viper-ex.el (viper-get-ex-token)
(viper-get-ex-pat, ex-set-read-variable):
* lisp/epg.el (epg--status-SIG_CREATED):
* lisp/erc/erc-speedbar.el (erc-speedbar-expand-user):
(erc-speedbar-expand-channel, erc-speedbar-expand-server)
* lisp/erc/erc.el (erc-is-message-ctcp-and-not-action-p)
(erc-banlist-update):
* lisp/eshell/em-dirs.el (eshell-parse-drive-letter, eshell/pwd):
* lisp/find-dired.el (find-dired):
* lisp/frame.el (frame-set-background-mode):
* lisp/generic-x.el (apache-log-generic-mode):
* lisp/gnus/gnus-art.el (gnus-button-valid-localpart-regexp):
* lisp/gnus/gnus.el (gnus-short-group-name):
* lisp/gnus/message.el (message-mailer-swallows-blank-line):
* lisp/ibuffer.el (ibuffer-fontification-alist):
* lisp/ido.el (ido-set-matches-1):
* lisp/info-xref.el (info-xref-lock-file-p):
* lisp/info.el (Info-dir-remove-duplicates)
(Info-unescape-quotes, Info-split-parameter-string)
(Info-speedbar-expand-node):
* lisp/international/mule.el (sgml-html-meta-auto-coding-function):
* lisp/isearch.el (isearch-pre-command-hook):
* lisp/language/ethio-util.el (ethio-fidel-to-tex-buffer):
* lisp/mail/rmail.el (rmail-collect-deleted):
* lisp/mh-e/mh-alias.el (mh-alias-suggest-alias):
* lisp/mh-e/mh-comp.el (mh-forward):
* lisp/mh-e/mh-search.el (mh-index-next-folder)
(mh-index-create-imenu-index):
* lisp/mh-e/mh-xface.el (mh-picon-get-image):
* lisp/minibuffer.el (completion--embedded-envvar-re):
* lisp/net/ange-ftp.el (ange-ftp-ls-parser):
* lisp/net/goto-addr.el (goto-address-mail-regexp)
(goto-address-find-address-at-point):
* lisp/net/pop3.el (pop3-read-response, pop3-user)
(pop3-pass, pop3-apop):
* lisp/net/tramp.el (tramp-ipv6-regexp)
(tramp-replace-environment-variables):
* lisp/nxml/nxml-maint.el (nxml-insert-target-repertoire-glyph-set):
* lisp/nxml/rng-uri.el (rng-uri-escape-multibyte):
* lisp/nxml/rng-xsd.el (rng-xsd-convert-any-uri):
* lisp/obsolete/pgg.el (pgg-fetch-key):
* lisp/obsolete/vip.el (vip-get-ex-token):
* lisp/org/ob-core.el (org-babel-string-read):
* lisp/org/org-agenda.el:
(org-agenda-add-entry-to-org-agenda-diary-file):
* lisp/org/org-element.el (org-element-keyword-parser):
* lisp/org/org-list.el (org-list-indent-item-generic):
* lisp/org/org-mhe.el (org-mhe-get-message-folder-from-index):
* lisp/org/org-mobile.el (org-mobile-apply):
* lisp/org/org-mouse.el (org-mouse-context-menu):
* lisp/org/org-plot.el (org-plot/gnuplot):
* lisp/org/org-protocol.el (org-protocol-flatten-greedy):
* lisp/org/org-table.el (org-table-copy-down)
(org-table-formula-make-cmp-string)
(org-table-get-stored-formulas, org-table-recalculate)
(org-table-edit-formulas):
* lisp/org/org.el (org-translate-link-from-planner)
(org-fill-line-break-nobreak-p):
* lisp/org/ox-ascii.el (org-ascii-item):
* lisp/org/ox-latex.el (org-latex-clean-invalid-line-breaks):
* lisp/org/ox.el (org-export-expand-include-keyword):
* lisp/progmodes/ada-xref.el (ada-treat-cmd-string):
* lisp/progmodes/cfengine.el (cfengine2-font-lock-keywords):
* lisp/progmodes/cperl-mode.el (cperl-to-comment-or-eol)
(cperl-find-pods-heres, cperl-fix-line-spacing)
(cperl-have-help-regexp, cperl-word-at-point-hard)
(cperl-make-regexp-x):
* lisp/progmodes/dcl-mode.el (dcl-option-value-offset):
* lisp/progmodes/etags.el (tag-implicit-name-match-p):
* lisp/progmodes/fortran.el (fortran-fill):
* lisp/progmodes/gdb-mi.el (gdb-speedbar-expand-node)
(gdb-locals-handler-custom):
* lisp/progmodes/grep.el (grep-mode-font-lock-keywords):
* lisp/progmodes/gud.el (gud-jdb-find-source-using-classpath):
* lisp/progmodes/js.el (js--continued-expression-p):
* lisp/progmodes/m4-mode.el (m4-font-lock-keywords):
* lisp/progmodes/meta-mode.el (meta-indent-level-count):
* lisp/progmodes/mixal-mode.el (mixal-font-lock-keywords):
* lisp/progmodes/opascal.el (opascal-find-unit-in-directory):
* lisp/progmodes/pascal.el (pascal-progbeg-re):
* lisp/progmodes/ruby-mode.el (ruby-expression-expansion-re)
(ruby-expr-beg, ruby-parse-partial)
(ruby-toggle-string-quotes, ruby-font-lock-keywords):
* lisp/progmodes/sql.el (sql--make-help-docstring):
* lisp/progmodes/verilog-mode.el (verilog-coverpoint-re)
(verilog-skip-forward-comment-p)
(verilog-read-sub-decls-gate)
(verilog-read-auto-template-middle):
* lisp/progmodes/vhdl-mode.el (vhdl-resolve-env-variable)
(vhdl-speedbar-expand-project, vhdl-speedbar-expand-entity)
(vhdl-speedbar-expand-architecture)
(vhdl-speedbar-expand-config, vhdl-speedbar-expand-package)
(vhdl-speedbar-dired):
* lisp/speedbar.el (speedbar-dired, speedbar-tag-file)
(speedbar-tag-expand):
* lisp/textmodes/dns-mode.el (dns-mode-font-lock-keywords):
* lisp/textmodes/flyspell.el (flyspell-debug-signal-word-checked):
* lisp/textmodes/ispell.el (ispell-process-line):
* lisp/textmodes/reftex-cite.el (reftex-end-of-bib-entry):
* lisp/textmodes/reftex-ref.el (reftex-replace-prefix-escapes):
* lisp/url/url-parse.el (url-generic-parse-url):
* lisp/url/url-util.el (url-truncate-url-for-viewing):
* lisp/vc/diff-mode.el (diff-unified->context):
* lisp/vc/vc-bzr.el (vc-bzr-error-regexp-alist):
* lisp/vc/vc-cvs.el (vc-cvs-parse-status):
* lisp/woman.el (woman0-el, woman-if-ignore)
(woman-change-fonts):
* lisp/xdg.el (xdg--substitute-home-env):
Fix regular-expression infelicities and typos.
Fix regular expression typos
Fix typos reported by Mattias Engdegård in:
that occurred in preloaded modules.
* lisp/frame.el (frame-set-background-mode):
* lisp/international/mule.el (sgml-html-meta-auto-coding-function):
* lisp/isearch.el (isearch-pre-command-hook):
* lisp/minibuffer.el (completion--embedded-envvar-re):
2019-03-04 18:00:00 -08:00
|
|
|
("^Grep[/a-zA-Z]* started.*"
|
2011-02-10 14:13:31 -05:00
|
|
|
(0 '(face nil compilation-message nil help-echo nil mouse-face nil) t))
|
2019-03-24 23:55:07 +02:00
|
|
|
("^Grep[/a-zA-Z]* finished with \\(?:\\(\\(?:[0-9]+ \\)?match\\(?:es\\)? found\\)\\|\\(no matches found\\)\\).*"
|
2011-02-10 14:13:31 -05:00
|
|
|
(0 '(face nil compilation-message nil help-echo nil mouse-face nil) t)
|
2005-08-09 21:37:34 +00:00
|
|
|
(1 compilation-info-face nil t)
|
|
|
|
(2 compilation-warning-face nil t))
|
Fix regular-expression glitches and typos
Problems reported by Mattias Engdegård in:
https://lists.gnu.org/r/emacs-devel/2019-03/msg00085.html
* admin/admin.el (set-version):
* lisp/allout.el (allout-latexify-one-item):
* lisp/arc-mode.el (archive-arc-rename-entry)
(archive-rar-summarize):
* lisp/calc/calc-graph.el (calc-graph-set-styles)
(calc-graph-hide):
* lisp/calc/calc-help.el (calc-describe-key):
* lisp/calc/calc-lang.el (math-compose-tex-func, eqn):
* lisp/calc/calc.el (calcDigit-key):
* lisp/cedet/ede/makefile-edit.el (makefile-macro-file-list):
* lisp/cedet/ede/speedbar.el (ede-tag-expand):
* lisp/cedet/semantic/sb.el (semantic-sb-show-extra)
(semantic-sb-expand-group):
* lisp/comint.el (comint-substitute-in-file-name):
* lisp/dired.el (dired-actual-switches):
* lisp/emacs-lisp/chart.el (chart-rmail-from):
* lisp/emacs-lisp/eieio-opt.el (eieio-sb-expand):
* lisp/emacs-lisp/eieio-speedbar.el (eieio-speedbar-object-expand):
* lisp/emacs-lisp/rx.el (rx-not, rx-atomic-p):
* lisp/emulation/viper-ex.el (viper-get-ex-token)
(viper-get-ex-pat, ex-set-read-variable):
* lisp/epg.el (epg--status-SIG_CREATED):
* lisp/erc/erc-speedbar.el (erc-speedbar-expand-user):
(erc-speedbar-expand-channel, erc-speedbar-expand-server)
* lisp/erc/erc.el (erc-is-message-ctcp-and-not-action-p)
(erc-banlist-update):
* lisp/eshell/em-dirs.el (eshell-parse-drive-letter, eshell/pwd):
* lisp/find-dired.el (find-dired):
* lisp/frame.el (frame-set-background-mode):
* lisp/generic-x.el (apache-log-generic-mode):
* lisp/gnus/gnus-art.el (gnus-button-valid-localpart-regexp):
* lisp/gnus/gnus.el (gnus-short-group-name):
* lisp/gnus/message.el (message-mailer-swallows-blank-line):
* lisp/ibuffer.el (ibuffer-fontification-alist):
* lisp/ido.el (ido-set-matches-1):
* lisp/info-xref.el (info-xref-lock-file-p):
* lisp/info.el (Info-dir-remove-duplicates)
(Info-unescape-quotes, Info-split-parameter-string)
(Info-speedbar-expand-node):
* lisp/international/mule.el (sgml-html-meta-auto-coding-function):
* lisp/isearch.el (isearch-pre-command-hook):
* lisp/language/ethio-util.el (ethio-fidel-to-tex-buffer):
* lisp/mail/rmail.el (rmail-collect-deleted):
* lisp/mh-e/mh-alias.el (mh-alias-suggest-alias):
* lisp/mh-e/mh-comp.el (mh-forward):
* lisp/mh-e/mh-search.el (mh-index-next-folder)
(mh-index-create-imenu-index):
* lisp/mh-e/mh-xface.el (mh-picon-get-image):
* lisp/minibuffer.el (completion--embedded-envvar-re):
* lisp/net/ange-ftp.el (ange-ftp-ls-parser):
* lisp/net/goto-addr.el (goto-address-mail-regexp)
(goto-address-find-address-at-point):
* lisp/net/pop3.el (pop3-read-response, pop3-user)
(pop3-pass, pop3-apop):
* lisp/net/tramp.el (tramp-ipv6-regexp)
(tramp-replace-environment-variables):
* lisp/nxml/nxml-maint.el (nxml-insert-target-repertoire-glyph-set):
* lisp/nxml/rng-uri.el (rng-uri-escape-multibyte):
* lisp/nxml/rng-xsd.el (rng-xsd-convert-any-uri):
* lisp/obsolete/pgg.el (pgg-fetch-key):
* lisp/obsolete/vip.el (vip-get-ex-token):
* lisp/org/ob-core.el (org-babel-string-read):
* lisp/org/org-agenda.el:
(org-agenda-add-entry-to-org-agenda-diary-file):
* lisp/org/org-element.el (org-element-keyword-parser):
* lisp/org/org-list.el (org-list-indent-item-generic):
* lisp/org/org-mhe.el (org-mhe-get-message-folder-from-index):
* lisp/org/org-mobile.el (org-mobile-apply):
* lisp/org/org-mouse.el (org-mouse-context-menu):
* lisp/org/org-plot.el (org-plot/gnuplot):
* lisp/org/org-protocol.el (org-protocol-flatten-greedy):
* lisp/org/org-table.el (org-table-copy-down)
(org-table-formula-make-cmp-string)
(org-table-get-stored-formulas, org-table-recalculate)
(org-table-edit-formulas):
* lisp/org/org.el (org-translate-link-from-planner)
(org-fill-line-break-nobreak-p):
* lisp/org/ox-ascii.el (org-ascii-item):
* lisp/org/ox-latex.el (org-latex-clean-invalid-line-breaks):
* lisp/org/ox.el (org-export-expand-include-keyword):
* lisp/progmodes/ada-xref.el (ada-treat-cmd-string):
* lisp/progmodes/cfengine.el (cfengine2-font-lock-keywords):
* lisp/progmodes/cperl-mode.el (cperl-to-comment-or-eol)
(cperl-find-pods-heres, cperl-fix-line-spacing)
(cperl-have-help-regexp, cperl-word-at-point-hard)
(cperl-make-regexp-x):
* lisp/progmodes/dcl-mode.el (dcl-option-value-offset):
* lisp/progmodes/etags.el (tag-implicit-name-match-p):
* lisp/progmodes/fortran.el (fortran-fill):
* lisp/progmodes/gdb-mi.el (gdb-speedbar-expand-node)
(gdb-locals-handler-custom):
* lisp/progmodes/grep.el (grep-mode-font-lock-keywords):
* lisp/progmodes/gud.el (gud-jdb-find-source-using-classpath):
* lisp/progmodes/js.el (js--continued-expression-p):
* lisp/progmodes/m4-mode.el (m4-font-lock-keywords):
* lisp/progmodes/meta-mode.el (meta-indent-level-count):
* lisp/progmodes/mixal-mode.el (mixal-font-lock-keywords):
* lisp/progmodes/opascal.el (opascal-find-unit-in-directory):
* lisp/progmodes/pascal.el (pascal-progbeg-re):
* lisp/progmodes/ruby-mode.el (ruby-expression-expansion-re)
(ruby-expr-beg, ruby-parse-partial)
(ruby-toggle-string-quotes, ruby-font-lock-keywords):
* lisp/progmodes/sql.el (sql--make-help-docstring):
* lisp/progmodes/verilog-mode.el (verilog-coverpoint-re)
(verilog-skip-forward-comment-p)
(verilog-read-sub-decls-gate)
(verilog-read-auto-template-middle):
* lisp/progmodes/vhdl-mode.el (vhdl-resolve-env-variable)
(vhdl-speedbar-expand-project, vhdl-speedbar-expand-entity)
(vhdl-speedbar-expand-architecture)
(vhdl-speedbar-expand-config, vhdl-speedbar-expand-package)
(vhdl-speedbar-dired):
* lisp/speedbar.el (speedbar-dired, speedbar-tag-file)
(speedbar-tag-expand):
* lisp/textmodes/dns-mode.el (dns-mode-font-lock-keywords):
* lisp/textmodes/flyspell.el (flyspell-debug-signal-word-checked):
* lisp/textmodes/ispell.el (ispell-process-line):
* lisp/textmodes/reftex-cite.el (reftex-end-of-bib-entry):
* lisp/textmodes/reftex-ref.el (reftex-replace-prefix-escapes):
* lisp/url/url-parse.el (url-generic-parse-url):
* lisp/url/url-util.el (url-truncate-url-for-viewing):
* lisp/vc/diff-mode.el (diff-unified->context):
* lisp/vc/vc-bzr.el (vc-bzr-error-regexp-alist):
* lisp/vc/vc-cvs.el (vc-cvs-parse-status):
* lisp/woman.el (woman0-el, woman-if-ignore)
(woman-change-fonts):
* lisp/xdg.el (xdg--substitute-home-env):
Fix regular-expression infelicities and typos.
Fix regular expression typos
Fix typos reported by Mattias Engdegård in:
that occurred in preloaded modules.
* lisp/frame.el (frame-set-background-mode):
* lisp/international/mule.el (sgml-html-meta-auto-coding-function):
* lisp/isearch.el (isearch-pre-command-hook):
* lisp/minibuffer.el (completion--embedded-envvar-re):
2019-03-04 18:00:00 -08:00
|
|
|
("^Grep[/a-zA-Z]* \\(exited abnormally\\|interrupt\\|killed\\|terminated\\)\\(?:.*with code \\([0-9]+\\)\\)?.*"
|
2011-02-10 14:13:31 -05:00
|
|
|
(0 '(face nil compilation-message nil help-echo nil mouse-face nil) t)
|
2005-08-09 21:37:34 +00:00
|
|
|
(1 grep-error-face)
|
2005-08-14 06:52:40 +00:00
|
|
|
(2 grep-error-face nil t))
|
2013-05-24 23:54:38 +03:00
|
|
|
;; "filename-linenumber-" format is used for context lines in GNU grep,
|
|
|
|
;; "filename=linenumber=" for lines with function names in "git grep -p".
|
2018-02-22 23:51:41 +02:00
|
|
|
("^.+?\\([-=\0]\\)[0-9]+\\([-=]\\).*\n"
|
|
|
|
(0 grep-context-face)
|
2017-07-30 14:47:05 -04:00
|
|
|
(1 (if (eq (char-after (match-beginning 1)) ?\0)
|
2018-02-22 23:51:41 +02:00
|
|
|
`(face nil display ,(match-string 2)))))
|
|
|
|
;; Hide excessive part of rgrep command
|
|
|
|
("^find \\(\\. -type d .*\\\\)\\)"
|
2018-03-11 14:56:00 +01:00
|
|
|
(1 (if grep-find-abbreviate grep-find-abbreviate-properties
|
|
|
|
'(face nil abbreviated-command t))))
|
2018-02-22 23:51:41 +02:00
|
|
|
;; Hide excessive part of lgrep command
|
|
|
|
("^grep \\( *--exclude.*--exclude[^ ]+\\)"
|
2018-03-11 14:56:00 +01:00
|
|
|
(1 (if grep-find-abbreviate grep-find-abbreviate-properties
|
|
|
|
'(face nil abbreviated-command t)))))
|
2004-03-11 22:56:19 +00:00
|
|
|
"Additional things to highlight in grep output.
|
|
|
|
This gets tacked on the end of the generated expressions.")
|
|
|
|
|
2004-07-03 10:06:42 +00:00
|
|
|
;;;###autoload
|
2016-04-21 05:08:29 +03:00
|
|
|
(defvar grep-program (purecopy "grep")
|
2003-11-23 20:56:10 +00:00
|
|
|
"The default grep program for `grep-command' and `grep-find-command'.
|
2016-04-21 05:08:29 +03:00
|
|
|
This variable's value takes effect when `grep-compute-defaults' is called.")
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2004-07-03 10:06:42 +00:00
|
|
|
;;;###autoload
|
2016-04-21 05:08:29 +03:00
|
|
|
(defvar find-program (purecopy "find")
|
2014-02-09 22:44:49 -08:00
|
|
|
"The default find program.
|
|
|
|
This is used by commands like `grep-find-command', `find-dired'
|
2016-04-21 05:08:29 +03:00
|
|
|
and others.")
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2007-11-20 16:40:16 +00:00
|
|
|
;;;###autoload
|
2016-04-21 05:08:29 +03:00
|
|
|
(defvar xargs-program (purecopy "xargs")
|
2007-11-20 16:40:16 +00:00
|
|
|
"The default xargs program for `grep-find-command'.
|
|
|
|
See `grep-find-use-xargs'.
|
2016-04-21 05:08:29 +03:00
|
|
|
This variable's value takes effect when `grep-compute-defaults' is called.")
|
2007-11-20 16:40:16 +00:00
|
|
|
|
2004-07-03 10:06:42 +00:00
|
|
|
;;;###autoload
|
2019-06-20 00:55:07 +03:00
|
|
|
(defcustom grep-find-use-xargs nil
|
2011-04-02 11:52:08 -07:00
|
|
|
"How to invoke find and grep.
|
|
|
|
If `exec', use `find -exec {} ;'.
|
|
|
|
If `exec-plus' use `find -exec {} +'.
|
2007-04-07 16:55:36 +00:00
|
|
|
If `gnu', use `find -print0' and `xargs -0'.
|
2019-06-20 00:55:07 +03:00
|
|
|
If `gnu-sort', use `find -print0', `sort -z' and `xargs -0'.
|
2011-04-02 11:52:08 -07:00
|
|
|
Any other value means to use `find -print' and `xargs'.
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2019-06-20 00:55:07 +03:00
|
|
|
This variable's value takes effect when `grep-compute-defaults' is called."
|
|
|
|
:type '(choice (const :tag "find -exec {} ;" exec)
|
|
|
|
(const :tag "find -exec {} +" exec-plus)
|
|
|
|
(const :tag "find -print0 | xargs -0" gnu)
|
|
|
|
(const :tag "find -print0 | sort -z | xargs -0'" gnu-sort)
|
|
|
|
string
|
|
|
|
(const :tag "Not Set" nil))
|
2020-01-21 09:16:25 -05:00
|
|
|
:set #'grep-apply-setting
|
|
|
|
:version "27.1")
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
;; History of grep commands.
|
2004-07-03 10:06:42 +00:00
|
|
|
;;;###autoload
|
2011-11-24 00:21:03 -08:00
|
|
|
(defvar grep-history nil "History list for grep.")
|
2004-07-03 10:06:42 +00:00
|
|
|
;;;###autoload
|
2011-11-24 00:21:03 -08:00
|
|
|
(defvar grep-find-history nil "History list for grep-find.")
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2006-04-28 22:22:01 +00:00
|
|
|
;; History of lgrep and rgrep regexp and files args.
|
|
|
|
(defvar grep-regexp-history nil)
|
2009-09-10 00:58:15 +00:00
|
|
|
(defvar grep-files-history nil)
|
2006-04-28 22:22:01 +00:00
|
|
|
|
2004-07-03 10:06:42 +00:00
|
|
|
;;;###autoload
|
2016-04-03 15:46:52 -07:00
|
|
|
(defun grep-process-setup ()
|
2003-11-23 20:56:10 +00:00
|
|
|
"Setup compilation variables and buffer for `grep'.
|
2016-04-03 15:46:52 -07:00
|
|
|
Set up `compilation-exit-message-function' and run `grep-setup-hook'."
|
2009-11-25 17:23:45 +00:00
|
|
|
(when (eq grep-highlight-matches 'auto-detect)
|
2004-09-07 18:10:49 +00:00
|
|
|
(grep-compute-defaults))
|
2009-11-25 17:23:45 +00:00
|
|
|
(unless (or (eq grep-highlight-matches 'auto-detect)
|
2011-09-05 12:48:26 +03:00
|
|
|
(null grep-highlight-matches)
|
|
|
|
;; Don't output color escapes if they can't be
|
|
|
|
;; highlighted with `font-lock-face' by `grep-filter'.
|
|
|
|
(null font-lock-mode))
|
2007-11-23 00:32:05 +00:00
|
|
|
;; `setenv' modifies `process-environment' let-bound in `compilation-start'
|
|
|
|
;; Any TERM except "dumb" allows GNU grep to use `--color=auto'
|
|
|
|
(setenv "TERM" "emacs-grep")
|
|
|
|
;; GREP_COLOR is used in GNU grep 2.5.1, but deprecated in later versions
|
2005-07-19 14:21:23 +00:00
|
|
|
(setenv "GREP_COLOR" "01;31")
|
2007-11-23 00:32:05 +00:00
|
|
|
;; GREP_COLORS is used in GNU grep 2.5.2 and later versions
|
2011-09-05 11:20:02 +03:00
|
|
|
(setenv "GREP_COLORS" "mt=01;31:fn=:ln=:bn=:se=:sl=:cx=:ne"))
|
2018-02-12 23:39:28 +02:00
|
|
|
(setq-local grep-num-matches-found 0)
|
2003-11-23 20:56:10 +00:00
|
|
|
(set (make-local-variable 'compilation-exit-message-function)
|
2020-01-21 09:16:25 -05:00
|
|
|
#'grep-exit-message)
|
2003-11-23 20:56:10 +00:00
|
|
|
(run-hooks 'grep-setup-hook))
|
|
|
|
|
2018-02-12 23:39:28 +02:00
|
|
|
(defun grep-exit-message (status code msg)
|
|
|
|
"Return a status message for grep results."
|
|
|
|
(if (eq status 'exit)
|
|
|
|
;; This relies on the fact that `compilation-start'
|
|
|
|
;; sets buffer-modified to nil before running the command,
|
|
|
|
;; so the buffer is still unmodified if there is no output.
|
|
|
|
(cond ((and (zerop code) (buffer-modified-p))
|
|
|
|
(if (> grep-num-matches-found 0)
|
2019-03-24 23:55:07 +02:00
|
|
|
(cons (format (ngettext "finished with %d match found\n"
|
|
|
|
"finished with %d matches found\n"
|
|
|
|
grep-num-matches-found)
|
|
|
|
grep-num-matches-found)
|
2018-02-12 23:39:28 +02:00
|
|
|
"matched")
|
|
|
|
'("finished with matches found\n" . "matched")))
|
|
|
|
((not (buffer-modified-p))
|
|
|
|
'("finished with no matches found\n" . "no match"))
|
|
|
|
(t
|
|
|
|
(cons msg code)))
|
|
|
|
(cons msg code)))
|
|
|
|
|
2011-05-08 01:17:17 -04:00
|
|
|
(defun grep-filter ()
|
|
|
|
"Handle match highlighting escape sequences inserted by the grep process.
|
|
|
|
This function is called from `compilation-filter-hook'."
|
|
|
|
(save-excursion
|
2011-05-12 12:10:17 -03:00
|
|
|
(forward-line 0)
|
2011-09-05 11:20:02 +03:00
|
|
|
(let ((end (point)) beg)
|
2011-05-08 01:17:17 -04:00
|
|
|
(goto-char compilation-filter-start)
|
2011-05-12 12:10:17 -03:00
|
|
|
(forward-line 0)
|
2011-09-05 11:20:02 +03:00
|
|
|
(setq beg (point))
|
2011-05-12 12:10:17 -03:00
|
|
|
;; Only operate on whole lines so we don't get caught with part of an
|
|
|
|
;; escape sequence in one chunk and the rest in another.
|
|
|
|
(when (< (point) end)
|
|
|
|
(setq end (copy-marker end))
|
|
|
|
;; Highlight grep matches and delete marking sequences.
|
2020-09-27 14:55:22 +02:00
|
|
|
(while (re-search-forward grep-match-regexp end 1)
|
2011-05-12 12:10:17 -03:00
|
|
|
(replace-match (propertize (match-string 1)
|
|
|
|
'face nil 'font-lock-face grep-match-face)
|
2018-02-12 23:39:28 +02:00
|
|
|
t t)
|
|
|
|
(cl-incf grep-num-matches-found))
|
2011-05-12 12:10:17 -03:00
|
|
|
;; Delete all remaining escape sequences
|
2011-09-05 11:20:02 +03:00
|
|
|
(goto-char beg)
|
2011-05-12 12:10:17 -03:00
|
|
|
(while (re-search-forward "\033\\[[0-9;]*[mK]" end 1)
|
|
|
|
(replace-match "" t t))))))
|
2011-05-08 01:17:17 -04:00
|
|
|
|
2006-04-28 22:22:01 +00:00
|
|
|
(defun grep-probe (command args &optional func result)
|
2009-08-25 10:11:08 +00:00
|
|
|
(let (process-file-side-effects)
|
|
|
|
(equal (condition-case nil
|
2020-01-21 09:16:25 -05:00
|
|
|
(apply (or func #'process-file) command args)
|
2009-08-25 10:11:08 +00:00
|
|
|
(error nil))
|
|
|
|
(or result 0))))
|
2006-04-28 22:22:01 +00:00
|
|
|
|
2004-07-03 10:06:42 +00:00
|
|
|
;;;###autoload
|
2003-11-23 20:56:10 +00:00
|
|
|
(defun grep-compute-defaults ()
|
2019-10-11 22:13:43 +02:00
|
|
|
"Compute the defaults for the `grep' command.
|
|
|
|
The value depends on `grep-command', `grep-template',
|
|
|
|
`grep-use-null-device', `grep-find-command', `grep-find-template',
|
|
|
|
`grep-use-null-filename-separator', `grep-find-use-xargs' and
|
|
|
|
`grep-highlight-matches'."
|
2007-07-22 19:59:30 +00:00
|
|
|
;; Keep default values.
|
|
|
|
(unless grep-host-defaults-alist
|
|
|
|
(add-to-list
|
|
|
|
'grep-host-defaults-alist
|
|
|
|
(cons nil
|
|
|
|
`((grep-command ,grep-command)
|
|
|
|
(grep-template ,grep-template)
|
|
|
|
(grep-use-null-device ,grep-use-null-device)
|
|
|
|
(grep-find-command ,grep-find-command)
|
|
|
|
(grep-find-template ,grep-find-template)
|
2016-09-13 20:48:09 -04:00
|
|
|
(grep-use-null-filename-separator
|
|
|
|
,grep-use-null-filename-separator)
|
2007-07-22 19:59:30 +00:00
|
|
|
(grep-find-use-xargs ,grep-find-use-xargs)
|
|
|
|
(grep-highlight-matches ,grep-highlight-matches)))))
|
|
|
|
(let* ((host-id
|
2008-02-01 01:38:32 +00:00
|
|
|
(intern (or (file-remote-p default-directory) "localhost")))
|
2007-07-22 19:59:30 +00:00
|
|
|
(host-defaults (assq host-id grep-host-defaults-alist))
|
2016-07-13 13:27:33 +09:00
|
|
|
(defaults (assq nil grep-host-defaults-alist))
|
|
|
|
(quot-braces (shell-quote-argument "{}"))
|
|
|
|
(quot-scolon (shell-quote-argument ";")))
|
2007-07-17 21:08:49 +00:00
|
|
|
;; There are different defaults on different hosts. They must be
|
2007-07-22 19:59:30 +00:00
|
|
|
;; computed for every host once.
|
2009-05-23 00:11:53 +00:00
|
|
|
(dolist (setting '(grep-command grep-template
|
|
|
|
grep-use-null-device grep-find-command
|
2016-09-13 20:48:09 -04:00
|
|
|
grep-use-null-filename-separator
|
|
|
|
grep-find-template grep-find-use-xargs
|
2009-05-23 00:11:53 +00:00
|
|
|
grep-highlight-matches))
|
|
|
|
(set setting
|
2010-04-14 11:33:42 -04:00
|
|
|
(cadr (or (assq setting host-defaults)
|
|
|
|
(assq setting defaults)))))
|
2007-07-17 21:08:49 +00:00
|
|
|
|
|
|
|
(unless (or (not grep-use-null-device) (eq grep-use-null-device t))
|
|
|
|
(setq grep-use-null-device
|
|
|
|
(with-temp-buffer
|
|
|
|
(let ((hello-file (expand-file-name "HELLO" data-directory)))
|
|
|
|
(not
|
|
|
|
(and (if grep-command
|
|
|
|
;; `grep-command' is already set, so
|
|
|
|
;; use that for testing.
|
|
|
|
(grep-probe grep-command
|
2018-07-08 10:00:17 -07:00
|
|
|
`(nil t nil "^Copyright" ,hello-file)
|
2007-07-17 21:08:49 +00:00
|
|
|
#'call-process-shell-command)
|
|
|
|
;; otherwise use `grep-program'
|
|
|
|
(grep-probe grep-program
|
2018-07-08 10:00:17 -07:00
|
|
|
`(nil t nil "-nH" "^Copyright" ,hello-file)))
|
2007-07-17 21:08:49 +00:00
|
|
|
(progn
|
|
|
|
(goto-char (point-min))
|
|
|
|
(looking-at
|
|
|
|
(concat (regexp-quote hello-file)
|
2018-07-08 10:00:17 -07:00
|
|
|
":[0-9]+:Copyright")))))))))
|
2014-11-19 00:05:09 +02:00
|
|
|
|
2016-09-13 20:48:09 -04:00
|
|
|
(when (eq grep-use-null-filename-separator 'auto-detect)
|
|
|
|
(setq grep-use-null-filename-separator
|
|
|
|
(with-temp-buffer
|
|
|
|
(let* ((hello-file (expand-file-name "HELLO" data-directory))
|
2018-07-08 10:00:17 -07:00
|
|
|
(args `("--null" "-ne" "^Copyright" ,hello-file)))
|
2016-09-13 20:48:09 -04:00
|
|
|
(if grep-use-null-device
|
|
|
|
(setq args (append args (list null-device)))
|
|
|
|
(push "-H" args))
|
|
|
|
(and (grep-probe grep-program `(nil t nil ,@args))
|
|
|
|
(progn
|
|
|
|
(goto-char (point-min))
|
|
|
|
(looking-at
|
|
|
|
(concat (regexp-quote hello-file)
|
2018-07-08 10:00:17 -07:00
|
|
|
"\0[0-9]+:Copyright"))))))))
|
2016-09-13 20:48:09 -04:00
|
|
|
|
2014-11-19 00:05:09 +02:00
|
|
|
(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)))))
|
|
|
|
|
2007-07-17 21:08:49 +00:00
|
|
|
(unless (and grep-command grep-find-command
|
|
|
|
grep-template grep-find-template)
|
|
|
|
(let ((grep-options
|
2015-06-26 20:21:50 +03:00
|
|
|
(concat (if grep-use-null-device "-n" "-nH")
|
2016-09-13 20:48:09 -04:00
|
|
|
(if grep-use-null-filename-separator " --null")
|
2020-10-07 05:41:23 +02:00
|
|
|
(when (grep-probe grep-program
|
|
|
|
`(nil nil nil "-e" "foo" ,null-device)
|
|
|
|
nil 1)
|
|
|
|
" -e"))))
|
2007-07-17 21:08:49 +00:00
|
|
|
(unless grep-command
|
|
|
|
(setq grep-command
|
2015-06-28 04:29:03 +03:00
|
|
|
(format "%s %s %s " grep-program
|
2015-06-26 20:21:50 +03:00
|
|
|
(or
|
|
|
|
(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"))
|
2015-06-28 04:29:03 +03:00
|
|
|
"")
|
|
|
|
grep-options)))
|
2007-07-17 21:08:49 +00:00
|
|
|
(unless grep-template
|
|
|
|
(setq grep-template
|
2009-09-10 00:58:15 +00:00
|
|
|
(format "%s <X> <C> %s <R> <F>" grep-program grep-options)))
|
2007-07-17 21:08:49 +00:00
|
|
|
(unless grep-find-use-xargs
|
|
|
|
(setq grep-find-use-xargs
|
|
|
|
(cond
|
2016-04-21 05:08:29 +03:00
|
|
|
((grep-probe find-program
|
2011-04-02 11:52:08 -07:00
|
|
|
`(nil nil nil ,null-device "-exec" "echo"
|
|
|
|
"{}" "+"))
|
|
|
|
'exec-plus)
|
2007-07-17 21:08:49 +00:00
|
|
|
((and
|
2016-04-21 05:08:29 +03:00
|
|
|
(grep-probe find-program `(nil nil nil ,null-device "-print0"))
|
2018-11-05 01:22:15 +01:00
|
|
|
(grep-probe xargs-program '(nil nil nil "-0" "echo")))
|
2007-07-17 21:08:49 +00:00
|
|
|
'gnu)
|
|
|
|
(t
|
|
|
|
'exec))))
|
|
|
|
(unless grep-find-command
|
|
|
|
(setq grep-find-command
|
2006-04-28 22:22:01 +00:00
|
|
|
(cond ((eq grep-find-use-xargs 'gnu)
|
2011-01-15 12:03:38 -08:00
|
|
|
;; Windows shells need the program file name
|
|
|
|
;; after the pipe symbol be quoted if they use
|
|
|
|
;; forward slashes as directory separators.
|
2012-11-30 15:37:23 +08:00
|
|
|
(format "%s . -type f -print0 | \"%s\" -0 %s"
|
2016-04-21 05:08:29 +03:00
|
|
|
find-program xargs-program grep-command))
|
2019-06-20 00:55:07 +03:00
|
|
|
((eq grep-find-use-xargs 'gnu-sort)
|
|
|
|
(format "%s . -type f -print0 | sort -z | \"%s\" -0 %s"
|
|
|
|
find-program xargs-program grep-command))
|
2011-04-02 11:52:08 -07:00
|
|
|
((memq grep-find-use-xargs '(exec exec-plus))
|
2007-07-17 21:08:49 +00:00
|
|
|
(let ((cmd0 (format "%s . -type f -exec %s"
|
2016-04-21 05:08:29 +03:00
|
|
|
find-program grep-command))
|
2011-04-02 11:52:08 -07:00
|
|
|
(null (if grep-use-null-device
|
|
|
|
(format "%s " null-device)
|
|
|
|
"")))
|
2007-07-17 21:08:49 +00:00
|
|
|
(cons
|
2011-04-02 11:52:08 -07:00
|
|
|
(if (eq grep-find-use-xargs 'exec-plus)
|
2016-07-13 13:27:33 +09:00
|
|
|
(format "%s %s%s +" cmd0 null quot-braces)
|
|
|
|
(format "%s %s %s%s" cmd0 quot-braces null quot-scolon))
|
2007-07-17 21:08:49 +00:00
|
|
|
(1+ (length cmd0)))))
|
2006-08-23 23:23:02 +00:00
|
|
|
(t
|
2011-01-15 12:03:38 -08:00
|
|
|
(format "%s . -type f -print | \"%s\" %s"
|
2016-04-21 05:08:29 +03:00
|
|
|
find-program xargs-program grep-command)))))
|
2007-07-17 21:08:49 +00:00
|
|
|
(unless grep-find-template
|
|
|
|
(setq grep-find-template
|
|
|
|
(let ((gcmd (format "%s <C> %s <R>"
|
2011-04-02 11:52:08 -07:00
|
|
|
grep-program grep-options))
|
|
|
|
(null (if grep-use-null-device
|
|
|
|
(format "%s " null-device)
|
|
|
|
"")))
|
2007-07-17 21:08:49 +00:00
|
|
|
(cond ((eq grep-find-use-xargs 'gnu)
|
2015-06-03 05:44:48 +03:00
|
|
|
(format "%s <D> <X> -type f <F> -print0 | \"%s\" -0 %s"
|
2016-04-21 05:08:29 +03:00
|
|
|
find-program xargs-program gcmd))
|
2019-06-20 00:55:07 +03:00
|
|
|
((eq grep-find-use-xargs 'gnu-sort)
|
|
|
|
(format "%s <D> <X> -type f <F> -print0 | sort -z | \"%s\" -0 %s"
|
|
|
|
find-program xargs-program gcmd))
|
2007-07-17 21:08:49 +00:00
|
|
|
((eq grep-find-use-xargs 'exec)
|
2016-07-13 13:27:33 +09:00
|
|
|
(format "%s <D> <X> -type f <F> -exec %s %s %s%s"
|
|
|
|
find-program gcmd quot-braces null quot-scolon))
|
2011-04-02 11:52:08 -07:00
|
|
|
((eq grep-find-use-xargs 'exec-plus)
|
2016-07-13 13:27:33 +09:00
|
|
|
(format "%s <D> <X> -type f <F> -exec %s %s%s +"
|
|
|
|
find-program gcmd null quot-braces))
|
2007-07-17 21:08:49 +00:00
|
|
|
(t
|
2015-06-03 05:44:48 +03:00
|
|
|
(format "%s <D> <X> -type f <F> -print | \"%s\" %s"
|
2016-04-21 05:08:29 +03:00
|
|
|
find-program xargs-program gcmd))))))))
|
2007-07-17 21:08:49 +00:00
|
|
|
|
|
|
|
;; Save defaults for this host.
|
2007-07-18 21:02:29 +00:00
|
|
|
(setq grep-host-defaults-alist
|
|
|
|
(delete (assq host-id grep-host-defaults-alist)
|
|
|
|
grep-host-defaults-alist))
|
|
|
|
(add-to-list
|
|
|
|
'grep-host-defaults-alist
|
|
|
|
(cons host-id
|
|
|
|
`((grep-command ,grep-command)
|
|
|
|
(grep-template ,grep-template)
|
|
|
|
(grep-use-null-device ,grep-use-null-device)
|
|
|
|
(grep-find-command ,grep-find-command)
|
|
|
|
(grep-find-template ,grep-find-template)
|
2018-02-21 22:30:29 +02:00
|
|
|
(grep-use-null-filename-separator
|
|
|
|
,grep-use-null-filename-separator)
|
2007-07-18 21:02:29 +00:00
|
|
|
(grep-find-use-xargs ,grep-find-use-xargs)
|
|
|
|
(grep-highlight-matches ,grep-highlight-matches))))))
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2006-07-28 23:03:18 +00:00
|
|
|
(defun grep-tag-default ()
|
|
|
|
(or (and transient-mark-mode mark-active
|
|
|
|
(/= (point) (mark))
|
|
|
|
(buffer-substring-no-properties (point) (mark)))
|
|
|
|
(funcall (or find-tag-default-function
|
|
|
|
(get major-mode 'find-tag-default-function)
|
2020-01-21 09:16:25 -05:00
|
|
|
#'find-tag-default))
|
2006-07-28 23:03:18 +00:00
|
|
|
""))
|
|
|
|
|
2003-11-23 20:56:10 +00:00
|
|
|
(defun grep-default-command ()
|
2007-11-20 16:40:16 +00:00
|
|
|
"Compute the default grep command for \\[universal-argument] \\[grep] to offer."
|
2006-07-28 23:03:18 +00:00
|
|
|
(let ((tag-default (shell-quote-argument (grep-tag-default)))
|
2006-07-29 02:03:21 +00:00
|
|
|
;; This a regexp to match single shell arguments.
|
|
|
|
;; Could someone please add comments explaining it?
|
2003-11-23 20:56:10 +00:00
|
|
|
(sh-arg-re "\\(\\(?:\"\\(?:[^\"]\\|\\\\\"\\)+\"\\|'[^']+'\\|[^\"' \t\n]\\)+\\)")
|
|
|
|
(grep-default (or (car grep-history) grep-command)))
|
2006-07-29 02:03:21 +00:00
|
|
|
;; In the default command, find the arg that specifies the pattern.
|
2003-11-23 20:56:10 +00:00
|
|
|
(when (or (string-match
|
|
|
|
(concat "[^ ]+\\s +\\(?:-[^ ]+\\s +\\)*"
|
|
|
|
sh-arg-re "\\(\\s +\\(\\S +\\)\\)?")
|
|
|
|
grep-default)
|
|
|
|
;; If the string is not yet complete.
|
|
|
|
(string-match "\\(\\)\\'" grep-default))
|
2006-07-29 02:03:21 +00:00
|
|
|
;; Maybe we will replace the pattern with the default tag.
|
|
|
|
;; But first, maybe replace the file name pattern.
|
|
|
|
(condition-case nil
|
|
|
|
(unless (or (not (stringp buffer-file-name))
|
|
|
|
(when (match-beginning 2)
|
|
|
|
(save-match-data
|
|
|
|
(string-match
|
|
|
|
(wildcard-to-regexp
|
|
|
|
(file-name-nondirectory
|
|
|
|
(match-string 3 grep-default)))
|
|
|
|
(file-name-nondirectory buffer-file-name)))))
|
|
|
|
(setq grep-default (concat (substring grep-default
|
|
|
|
0 (match-beginning 2))
|
|
|
|
" *."
|
|
|
|
(file-name-extension buffer-file-name))))
|
|
|
|
;; In case wildcard-to-regexp gets an error
|
|
|
|
;; from invalid data.
|
|
|
|
(error nil))
|
|
|
|
;; Now replace the pattern with the default tag.
|
2004-11-03 11:45:20 +00:00
|
|
|
(replace-match tag-default t t grep-default 1))))
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2006-04-28 22:22:01 +00:00
|
|
|
|
2003-11-23 20:56:10 +00:00
|
|
|
;;;###autoload
|
2006-04-28 22:22:01 +00:00
|
|
|
(define-compilation-mode grep-mode "Grep"
|
|
|
|
"Sets `grep-last-buffer' and `compilation-window-height'."
|
|
|
|
(setq grep-last-buffer (current-buffer))
|
2008-02-25 10:52:57 +00:00
|
|
|
(set (make-local-variable 'tool-bar-map) grep-mode-tool-bar-map)
|
2006-04-28 22:22:01 +00:00
|
|
|
(set (make-local-variable 'compilation-error-face)
|
|
|
|
grep-hit-face)
|
|
|
|
(set (make-local-variable 'compilation-error-regexp-alist)
|
2017-07-30 14:47:05 -04:00
|
|
|
grep-regexp-alist)
|
2018-02-12 23:39:28 +02:00
|
|
|
(set (make-local-variable 'compilation-mode-line-errors)
|
|
|
|
grep-mode-line-matches)
|
2011-05-21 20:18:22 -03:00
|
|
|
;; compilation-directory-matcher can't be nil, so we set it to a regexp that
|
|
|
|
;; can never match.
|
Add standard unmatchable regexp
Add `regexp-unmatchable' as a standard unmatchable regexp, defined as
"\\`a\\`". Use it where such a regexp is needed, replacing slower
expressions in several places.
From a suggestion by Philippe Schnoebelen.
* lisp/subr.el (regexp-unmatchable): New defconst.
* etc/NEWS (Lisp Changes): Mention `regexp-unmatchable'.
* doc/lispref/searching.texi (Regexp Functions): Document it.
* lisp/emacs-lisp/regexp-opt.el (regexp-opt)
* lisp/progmodes/cc-defs.el (cc-conditional-require-after-load)
(c-make-keywords-re)
* lisp/progmodes/cc-engine.el (c-beginning-of-statement-1)
(c-forward-<>-arglist-recur, c-forward-decl-or-cast-1)
(c-looking-at-decl-block)
* lisp/progmodes/cc-fonts.el (c-doc-line-join-re)
(c-doc-bright-comment-start-re)
* lisp/progmodes/cc-langs.el (c-populate-syntax-table)
(c-assignment-op-regexp)
(c-block-comment-ender-regexp, c-font-lock-comment-end-skip)
(c-block-comment-start-regexp, c-line-comment-start-regexp)
(c-doc-comment-start-regexp, c-decl-start-colon-kwd-re)
(c-type-decl-prefix-key, c-type-decl-operator-prefix-key)
(c-pre-id-bracelist-key, c-enum-clause-introduction-re)
(c-nonlabel-token-2-key)
* lisp/progmodes/cc-mode.el (c-doc-fl-decl-start, c-doc-fl-decl-end)
* lisp/progmodes/cc-vars.el (c-noise-macro-with-parens-name-re)
(c-noise-macro-name-re, c-make-noise-macro-regexps)
* lisp/progmodes/octave.el (octave-help-mode)
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode, vc-bzr-revision-completion-table)
* lisp/vc/vc-git.el (vc-git-log-view-mode)
* lisp/vc/vc-hg.el (vc-hg-log-view-mode)
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
Use `regexp-unmatchable'.
* lisp/textmodes/ispell.el (ispell-non-empty-string):
Use `regexp-unmatchable', fixing a broken never-match regexp.
2019-05-14 11:43:49 +02:00
|
|
|
(set (make-local-variable 'compilation-directory-matcher)
|
|
|
|
(list regexp-unmatchable))
|
2006-04-28 22:22:01 +00:00
|
|
|
(set (make-local-variable 'compilation-process-setup-function)
|
2020-01-21 09:16:25 -05:00
|
|
|
#'grep-process-setup)
|
2011-05-08 01:17:17 -04:00
|
|
|
(set (make-local-variable 'compilation-disable-input) t)
|
2011-09-07 15:00:52 +03:00
|
|
|
(set (make-local-variable 'compilation-error-screen-columns)
|
|
|
|
grep-error-screen-columns)
|
2020-01-21 09:16:25 -05:00
|
|
|
(add-hook 'compilation-filter-hook #'grep-filter nil t))
|
2006-04-28 22:22:01 +00:00
|
|
|
|
2016-02-29 16:20:05 +11:00
|
|
|
(defun grep--save-buffers ()
|
|
|
|
(when grep-save-buffers
|
|
|
|
(save-some-buffers (and (not (eq grep-save-buffers 'ask))
|
|
|
|
(not (functionp grep-save-buffers)))
|
|
|
|
(and (functionp grep-save-buffers)
|
|
|
|
grep-save-buffers))))
|
2006-04-28 22:22:01 +00:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun grep (command-args)
|
2019-10-11 22:13:43 +02:00
|
|
|
"Run Grep with user-specified COMMAND-ARGS.
|
|
|
|
The output from the command goes to the \"*grep*\" buffer.
|
|
|
|
|
2015-10-25 22:05:44 +02:00
|
|
|
While Grep runs asynchronously, you can use \\[next-error] (M-x next-error),
|
2012-04-18 14:04:51 +08:00
|
|
|
or \\<grep-mode-map>\\[compile-goto-error] in the *grep* \
|
2015-10-25 22:05:44 +02:00
|
|
|
buffer, to go to the lines where Grep found
|
|
|
|
matches. To kill the Grep job before it finishes, type \\[kill-compilation].
|
|
|
|
|
|
|
|
Noninteractively, COMMAND-ARGS should specify the Grep command-line
|
|
|
|
arguments.
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2007-02-12 06:44:47 +00:00
|
|
|
For doing a recursive `grep', see the `rgrep' command. For running
|
2015-10-25 22:05:44 +02:00
|
|
|
Grep in a specific directory, see `lgrep'.
|
2007-02-12 06:44:47 +00:00
|
|
|
|
2007-11-20 16:40:16 +00:00
|
|
|
This command uses a special history list for its COMMAND-ARGS, so you
|
|
|
|
can easily repeat a grep command.
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2015-10-25 22:05:44 +02:00
|
|
|
A prefix argument says to default the COMMAND-ARGS based on the current
|
|
|
|
tag the cursor is over, substituting it into the last Grep command
|
|
|
|
in the Grep command history (or into `grep-command' if that history
|
2007-11-20 16:40:16 +00:00
|
|
|
list is empty)."
|
2003-11-23 20:56:10 +00:00
|
|
|
(interactive
|
|
|
|
(progn
|
2006-04-28 22:22:01 +00:00
|
|
|
(grep-compute-defaults)
|
2003-11-23 20:56:10 +00:00
|
|
|
(let ((default (grep-default-command)))
|
2008-03-20 19:56:58 +00:00
|
|
|
(list (read-shell-command "Run grep (like this): "
|
|
|
|
(if current-prefix-arg default grep-command)
|
|
|
|
'grep-history
|
|
|
|
(if current-prefix-arg nil default))))))
|
2016-04-03 15:46:53 -07:00
|
|
|
|
2016-02-29 16:20:05 +11:00
|
|
|
(grep--save-buffers)
|
2003-11-23 20:56:10 +00:00
|
|
|
;; Setting process-setup-function makes exit-message-function work
|
|
|
|
;; even when async processes aren't supported.
|
2005-08-25 19:09:22 +00:00
|
|
|
(compilation-start (if (and grep-use-null-device null-device)
|
|
|
|
(concat command-args " " null-device)
|
|
|
|
command-args)
|
2020-01-21 09:16:25 -05:00
|
|
|
#'grep-mode))
|
2004-03-11 22:56:19 +00:00
|
|
|
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun grep-find (command-args)
|
|
|
|
"Run grep via find, with user-specified args COMMAND-ARGS.
|
2019-10-11 22:13:43 +02:00
|
|
|
Collect output in the \"*grep*\" buffer.
|
2003-11-23 20:56:10 +00:00
|
|
|
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
|
|
|
|
(progn
|
2006-04-28 22:22:01 +00:00
|
|
|
(grep-compute-defaults)
|
2004-01-29 17:54:36 +00:00
|
|
|
(if grep-find-command
|
2008-03-20 19:56:58 +00:00
|
|
|
(list (read-shell-command "Run find (like this): "
|
|
|
|
grep-find-command 'grep-find-history))
|
2004-01-29 17:54:36 +00:00
|
|
|
;; No default was set
|
|
|
|
(read-string
|
|
|
|
"compile.el: No `grep-find-command' command available. Press RET.")
|
|
|
|
(list nil))))
|
2006-05-18 14:39:09 +00:00
|
|
|
(when command-args
|
2004-01-29 17:54:36 +00:00
|
|
|
(let ((null-device nil)) ; see grep
|
|
|
|
(grep command-args))))
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2005-01-22 15:43:56 +00:00
|
|
|
;;;###autoload
|
|
|
|
(defalias 'find-grep 'grep-find)
|
|
|
|
|
2006-04-28 22:22:01 +00:00
|
|
|
|
|
|
|
;; User-friendly interactive API.
|
|
|
|
|
|
|
|
(defconst grep-expand-keywords
|
2015-06-26 20:21:50 +03:00
|
|
|
'(("<C>" . (mapconcat #'identity opts " "))
|
2015-06-03 05:44:48 +03:00
|
|
|
("<D>" . (or dir "."))
|
2006-04-28 22:22:01 +00:00
|
|
|
("<F>" . files)
|
|
|
|
("<N>" . null-device)
|
|
|
|
("<X>" . excl)
|
|
|
|
("<R>" . (shell-quote-argument (or regexp ""))))
|
|
|
|
"List of substitutions performed by `grep-expand-template'.
|
2019-10-11 22:13:43 +02:00
|
|
|
If car of an element matches, the cdr is evalled in order to get the
|
|
|
|
substitution string.
|
|
|
|
|
|
|
|
The substitution is based on variables bound dynamically, and
|
|
|
|
these include `opts', `dir', `files', `null-device', `excl' and
|
|
|
|
`regexp'.")
|
2006-04-28 22:22:01 +00:00
|
|
|
|
|
|
|
(defun grep-expand-template (template &optional regexp files dir excl)
|
2019-10-11 22:13:43 +02:00
|
|
|
"Expand grep COMMAND string replacing <C>, <D>, <F>, <R>, and <X>."
|
2014-04-12 15:38:06 -04:00
|
|
|
(let* ((command template)
|
2015-06-26 20:21:50 +03:00
|
|
|
(env `((opts . ,(let (opts)
|
|
|
|
(when (and case-fold-search
|
|
|
|
(isearch-no-upper-case-p regexp t))
|
|
|
|
(push "-i" opts))
|
|
|
|
(cond
|
|
|
|
((eq grep-highlight-matches 'always)
|
|
|
|
(push "--color=always" opts))
|
|
|
|
((eq grep-highlight-matches 'auto)
|
|
|
|
(push "--color" opts)))
|
|
|
|
opts))
|
2014-04-12 15:38:06 -04:00
|
|
|
(excl . ,excl)
|
|
|
|
(dir . ,dir)
|
|
|
|
(files . ,files)
|
|
|
|
(regexp . ,regexp)))
|
|
|
|
(case-fold-search nil))
|
2006-04-28 22:22:01 +00:00
|
|
|
(dolist (kw grep-expand-keywords command)
|
|
|
|
(if (string-match (car kw) command)
|
2006-05-01 09:33:10 +00:00
|
|
|
(setq command
|
|
|
|
(replace-match
|
|
|
|
(or (if (symbolp (cdr kw))
|
2014-04-12 15:38:06 -04:00
|
|
|
(eval (cdr kw) env)
|
|
|
|
(save-match-data (eval (cdr kw) env)))
|
2006-05-01 09:33:10 +00:00
|
|
|
"")
|
|
|
|
t t command))))))
|
2006-04-28 22:22:01 +00:00
|
|
|
|
|
|
|
(defun grep-read-regexp ()
|
2014-02-13 22:59:24 -08:00
|
|
|
"Read regexp arg for interactive grep using `read-regexp'."
|
2013-12-20 21:55:56 +02:00
|
|
|
(read-regexp "Search for" 'grep-tag-default 'grep-regexp-history))
|
2006-04-28 22:22:01 +00:00
|
|
|
|
2020-01-21 09:16:25 -05:00
|
|
|
(defvar grep-read-files-function #'grep-read-files--default)
|
|
|
|
|
|
|
|
(defun grep-read-files--default ()
|
|
|
|
;; Instead of a `grep-read-files-function' variable, we used to lookup
|
|
|
|
;; mode-specific functions in the major mode's symbol properties, so preserve
|
|
|
|
;; this behavior for backward compatibility.
|
|
|
|
(let ((old-function (get major-mode 'grep-read-files))) ;Obsolete since 28.1
|
|
|
|
(if old-function
|
|
|
|
(funcall old-function)
|
|
|
|
(let ((file-name-at-point
|
|
|
|
(run-hook-with-args-until-success 'file-name-at-point-functions)))
|
|
|
|
(or (if (and (stringp file-name-at-point)
|
|
|
|
(not (file-directory-p file-name-at-point)))
|
|
|
|
file-name-at-point)
|
|
|
|
(buffer-file-name)
|
|
|
|
(replace-regexp-in-string "<[0-9]+>\\'" "" (buffer-name)))))))
|
|
|
|
|
2006-04-28 22:22:01 +00:00
|
|
|
(defun grep-read-files (regexp)
|
2017-10-09 16:39:25 +03:00
|
|
|
"Read a file-name pattern arg for interactive grep.
|
2020-01-21 09:16:25 -05:00
|
|
|
The pattern can include shell wildcards. As SPC can triggers
|
2017-11-17 15:39:02 +02:00
|
|
|
completion when entering a pattern, including it requires
|
2019-10-11 22:13:43 +02:00
|
|
|
quoting, e.g. `\\[quoted-insert]<space>'.
|
|
|
|
|
|
|
|
REGEXP is used as a string in the prompt."
|
2020-01-21 09:16:25 -05:00
|
|
|
(let* ((bn (funcall grep-read-files-function))
|
2006-04-28 23:39:02 +00:00
|
|
|
(fn (and bn
|
|
|
|
(stringp bn)
|
|
|
|
(file-name-nondirectory bn)))
|
2009-09-10 00:58:15 +00:00
|
|
|
(default-alias
|
|
|
|
(and fn
|
2010-05-21 23:43:04 +03:00
|
|
|
(let ((aliases (remove (assoc "all" grep-files-aliases)
|
|
|
|
grep-files-aliases))
|
2009-09-10 00:58:15 +00:00
|
|
|
alias)
|
|
|
|
(while aliases
|
|
|
|
(setq alias (car aliases)
|
|
|
|
aliases (cdr aliases))
|
2010-05-21 23:43:04 +03:00
|
|
|
(if (string-match (mapconcat
|
2020-01-21 09:16:25 -05:00
|
|
|
#'wildcard-to-regexp
|
2010-05-21 23:43:04 +03:00
|
|
|
(split-string (cdr alias) nil t)
|
|
|
|
"\\|")
|
|
|
|
fn)
|
2009-09-10 00:58:15 +00:00
|
|
|
(setq aliases nil)
|
|
|
|
(setq alias nil)))
|
|
|
|
(cdr alias))))
|
|
|
|
(default-extension
|
|
|
|
(and fn
|
|
|
|
(let ((ext (file-name-extension fn)))
|
|
|
|
(and ext (concat "*." ext)))))
|
2006-04-28 23:39:02 +00:00
|
|
|
(default
|
2009-09-10 00:58:15 +00:00
|
|
|
(or default-alias
|
|
|
|
default-extension
|
2006-07-28 23:20:21 +00:00
|
|
|
(car grep-files-history)
|
|
|
|
(car (car grep-files-aliases))))
|
2009-12-07 17:35:47 +00:00
|
|
|
(files (completing-read
|
2006-04-28 22:22:01 +00:00
|
|
|
(concat "Search for \"" regexp
|
2017-10-09 16:39:25 +03:00
|
|
|
"\" in files matching wildcard"
|
2006-04-28 23:39:02 +00:00
|
|
|
(if default (concat " (default " default ")"))
|
|
|
|
": ")
|
2020-01-21 09:16:25 -05:00
|
|
|
#'read-file-name-internal
|
2009-12-07 17:35:47 +00:00
|
|
|
nil nil nil 'grep-files-history
|
2009-09-10 00:58:15 +00:00
|
|
|
(delete-dups
|
|
|
|
(delq nil (append (list default default-alias default-extension)
|
2020-01-21 09:16:25 -05:00
|
|
|
(mapcar #'car grep-files-aliases)))))))
|
2006-04-28 22:22:01 +00:00
|
|
|
(and files
|
|
|
|
(or (cdr (assoc files grep-files-aliases))
|
|
|
|
files))))
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
;;;###autoload
|
2009-08-22 00:17:56 +00:00
|
|
|
(defun lgrep (regexp &optional files dir confirm)
|
2007-02-14 11:54:12 +00:00
|
|
|
"Run grep, searching for REGEXP in FILES in directory DIR.
|
2003-11-23 20:56:10 +00:00
|
|
|
The search is limited to file names matching shell pattern FILES.
|
2006-04-28 22:22:01 +00:00
|
|
|
FILES may use abbreviations defined in `grep-files-aliases', e.g.
|
2017-11-17 15:39:02 +02:00
|
|
|
entering `ch' is equivalent to `*.[ch]'. As whitespace triggers
|
|
|
|
completion when entering a pattern, including it requires
|
|
|
|
quoting, e.g. `\\[quoted-insert]<space>'.
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2006-05-08 10:26:30 +00:00
|
|
|
With \\[universal-argument] prefix, you can edit the constructed shell command line
|
|
|
|
before it is executed.
|
|
|
|
With two \\[universal-argument] prefixes, directly edit and run `grep-command'.
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2019-10-11 22:13:43 +02:00
|
|
|
Collect output in the \"*grep*\" buffer. While grep runs asynchronously, you
|
2007-11-20 16:40:16 +00:00
|
|
|
can use \\[next-error] (M-x next-error), or \\<grep-mode-map>\\[compile-goto-error] \
|
|
|
|
in the grep output buffer,
|
|
|
|
to go to the lines where grep found matches.
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2019-10-11 22:13:43 +02:00
|
|
|
This command shares argument histories with \\[rgrep] and \\[grep].
|
|
|
|
|
2019-10-12 09:52:03 +03:00
|
|
|
If CONFIRM is non-nil, the user will be given an opportunity to edit the
|
2019-10-11 22:13:43 +02:00
|
|
|
command before it's run."
|
2003-11-23 20:56:10 +00:00
|
|
|
(interactive
|
2006-04-28 22:22:01 +00:00
|
|
|
(progn
|
|
|
|
(grep-compute-defaults)
|
|
|
|
(cond
|
|
|
|
((and grep-command (equal current-prefix-arg '(16)))
|
|
|
|
(list (read-from-minibuffer "Run: " grep-command
|
2009-08-22 00:17:56 +00:00
|
|
|
nil nil 'grep-history)))
|
2006-04-28 22:22:01 +00:00
|
|
|
((not grep-template)
|
2009-09-24 01:37:14 +00:00
|
|
|
(error "grep.el: No `grep-template' available"))
|
2006-04-28 22:22:01 +00:00
|
|
|
(t (let* ((regexp (grep-read-regexp))
|
2007-02-14 11:54:12 +00:00
|
|
|
(files (grep-read-files regexp))
|
|
|
|
(dir (read-directory-name "In directory: "
|
2009-08-22 00:17:56 +00:00
|
|
|
nil default-directory t))
|
|
|
|
(confirm (equal current-prefix-arg '(4))))
|
|
|
|
(list regexp files dir confirm))))))
|
2006-04-28 22:22:01 +00:00
|
|
|
(when (and (stringp regexp) (> (length regexp) 0))
|
2014-05-09 12:10:56 +03:00
|
|
|
(unless (and dir (file-accessible-directory-p dir))
|
2009-08-22 00:17:56 +00:00
|
|
|
(setq dir default-directory))
|
2006-04-28 22:22:01 +00:00
|
|
|
(let ((command regexp))
|
|
|
|
(if (null files)
|
|
|
|
(if (string= command grep-command)
|
|
|
|
(setq command nil))
|
2007-02-14 11:54:12 +00:00
|
|
|
(setq dir (file-name-as-directory (expand-file-name dir)))
|
2006-04-28 22:22:01 +00:00
|
|
|
(setq command (grep-expand-template
|
|
|
|
grep-template
|
|
|
|
regexp
|
2009-09-10 00:58:15 +00:00
|
|
|
files
|
|
|
|
nil
|
|
|
|
(and grep-find-ignored-files
|
|
|
|
(concat " --exclude="
|
|
|
|
(mapconcat
|
|
|
|
#'(lambda (ignore)
|
|
|
|
(cond ((stringp ignore)
|
|
|
|
(shell-quote-argument ignore))
|
|
|
|
((consp ignore)
|
|
|
|
(and (funcall (car ignore) dir)
|
|
|
|
(shell-quote-argument
|
|
|
|
(cdr ignore))))))
|
|
|
|
grep-find-ignored-files
|
|
|
|
" --exclude=")))))
|
2006-04-28 22:22:01 +00:00
|
|
|
(when command
|
2020-10-09 06:15:02 +02:00
|
|
|
(when (grep-probe grep-program
|
|
|
|
`(nil nil nil "--directories=skip" "foo"
|
|
|
|
,null-device)
|
|
|
|
nil 1)
|
|
|
|
(setq command (concat command " --directories=skip")))
|
2009-08-22 00:17:56 +00:00
|
|
|
(if confirm
|
2006-04-28 22:22:01 +00:00
|
|
|
(setq command
|
|
|
|
(read-from-minibuffer "Confirm: "
|
|
|
|
command nil nil 'grep-history))
|
2006-05-05 23:38:18 +00:00
|
|
|
(add-to-history 'grep-history command))))
|
2006-04-28 22:22:01 +00:00
|
|
|
(when command
|
2009-08-22 00:17:56 +00:00
|
|
|
(let ((default-directory dir))
|
2007-02-14 11:54:12 +00:00
|
|
|
;; Setting process-setup-function makes exit-message-function work
|
|
|
|
;; even when async processes aren't supported.
|
2016-02-29 16:20:05 +11:00
|
|
|
(grep--save-buffers)
|
2007-02-14 11:54:12 +00:00
|
|
|
(compilation-start (if (and grep-use-null-device null-device)
|
|
|
|
(concat command " " null-device)
|
2007-08-17 04:30:09 +00:00
|
|
|
command)
|
|
|
|
'grep-mode))
|
2018-04-17 22:27:48 +03:00
|
|
|
;; Set default-directory if we started lgrep in the *grep* buffer.
|
2007-02-14 11:54:12 +00:00
|
|
|
(if (eq next-error-last-buffer (current-buffer))
|
|
|
|
(setq default-directory dir))))))
|
|
|
|
|
2006-04-28 22:22:01 +00:00
|
|
|
|
2009-11-19 17:37:22 +00:00
|
|
|
(defvar find-name-arg) ; not autoloaded but defined in find-dired
|
2006-04-28 22:22:01 +00:00
|
|
|
|
|
|
|
;;;###autoload
|
2009-08-22 00:17:56 +00:00
|
|
|
(defun rgrep (regexp &optional files dir confirm)
|
2006-05-08 10:26:30 +00:00
|
|
|
"Recursively grep for REGEXP in FILES in directory tree rooted at DIR.
|
2006-04-28 22:22:01 +00:00
|
|
|
The search is limited to file names matching shell pattern FILES.
|
|
|
|
FILES may use abbreviations defined in `grep-files-aliases', e.g.
|
2017-11-17 15:39:02 +02:00
|
|
|
entering `ch' is equivalent to `*.[ch]'. As whitespace triggers
|
|
|
|
completion when entering a pattern, including it requires
|
|
|
|
quoting, e.g. `\\[quoted-insert]<space>'.
|
2006-04-28 22:22:01 +00:00
|
|
|
|
2006-05-08 10:26:30 +00:00
|
|
|
With \\[universal-argument] prefix, you can edit the constructed shell command line
|
|
|
|
before it is executed.
|
|
|
|
With two \\[universal-argument] prefixes, directly edit and run `grep-find-command'.
|
2006-04-28 22:22:01 +00:00
|
|
|
|
2019-10-11 22:13:43 +02:00
|
|
|
Collect output in the \"*grep*\" buffer. While the recursive grep is running,
|
2012-04-18 14:04:51 +08:00
|
|
|
you can use \\[next-error] (M-x next-error), or \\<grep-mode-map>\\[compile-goto-error] \
|
2007-11-20 16:40:16 +00:00
|
|
|
in the grep output buffer,
|
2012-04-18 14:04:51 +08:00
|
|
|
to visit the lines where matches were found. To kill the job
|
|
|
|
before it finishes, type \\[kill-compilation].
|
2006-04-28 22:22:01 +00:00
|
|
|
|
2011-12-23 00:32:46 +02:00
|
|
|
This command shares argument histories with \\[lgrep] and \\[grep-find].
|
|
|
|
|
|
|
|
When called programmatically and FILES is nil, REGEXP is expected
|
2019-10-11 22:13:43 +02:00
|
|
|
to specify a command to run.
|
|
|
|
|
2019-10-12 09:52:03 +03:00
|
|
|
If CONFIRM is non-nil, the user will be given an opportunity to edit the
|
2019-10-11 22:13:43 +02:00
|
|
|
command before it's run."
|
2006-04-28 22:22:01 +00:00
|
|
|
(interactive
|
|
|
|
(progn
|
|
|
|
(grep-compute-defaults)
|
|
|
|
(cond
|
|
|
|
((and grep-find-command (equal current-prefix-arg '(16)))
|
|
|
|
(list (read-from-minibuffer "Run: " grep-find-command
|
2009-08-22 00:17:56 +00:00
|
|
|
nil nil 'grep-find-history)))
|
2006-04-28 22:22:01 +00:00
|
|
|
((not grep-find-template)
|
2009-09-24 01:37:14 +00:00
|
|
|
(error "grep.el: No `grep-find-template' available"))
|
2006-04-28 22:22:01 +00:00
|
|
|
(t (let* ((regexp (grep-read-regexp))
|
|
|
|
(files (grep-read-files regexp))
|
|
|
|
(dir (read-directory-name "Base directory: "
|
2009-08-22 00:17:56 +00:00
|
|
|
nil default-directory t))
|
|
|
|
(confirm (equal current-prefix-arg '(4))))
|
|
|
|
(list regexp files dir confirm))))))
|
2006-04-28 22:22:01 +00:00
|
|
|
(when (and (stringp regexp) (> (length regexp) 0))
|
2014-05-09 00:02:00 -07:00
|
|
|
(unless (and dir (file-accessible-directory-p dir))
|
2009-08-22 00:17:56 +00:00
|
|
|
(setq dir default-directory))
|
2006-04-28 22:22:01 +00:00
|
|
|
(if (null files)
|
2011-08-17 20:11:49 +03:00
|
|
|
(if (not (string= regexp (if (consp grep-find-command)
|
|
|
|
(car grep-find-command)
|
|
|
|
grep-find-command)))
|
2011-07-06 17:49:19 +02:00
|
|
|
(compilation-start regexp 'grep-mode))
|
2006-05-09 12:47:12 +00:00
|
|
|
(setq dir (file-name-as-directory (expand-file-name dir)))
|
2015-06-03 05:44:48 +03:00
|
|
|
(let ((command (rgrep-default-command regexp files nil)))
|
2006-04-28 22:22:01 +00:00
|
|
|
(when command
|
2009-08-22 00:17:56 +00:00
|
|
|
(if confirm
|
2006-04-28 22:22:01 +00:00
|
|
|
(setq command
|
|
|
|
(read-from-minibuffer "Confirm: "
|
|
|
|
command nil nil 'grep-find-history))
|
2006-05-05 23:38:18 +00:00
|
|
|
(add-to-history 'grep-find-history command))
|
2016-02-29 16:20:05 +11:00
|
|
|
(grep--save-buffers)
|
2011-08-10 21:29:31 +03:00
|
|
|
(let ((default-directory dir))
|
2006-05-09 12:47:12 +00:00
|
|
|
(compilation-start command 'grep-mode))
|
|
|
|
;; Set default-directory if we started rgrep in the *grep* buffer.
|
|
|
|
(if (eq next-error-last-buffer (current-buffer))
|
|
|
|
(setq default-directory dir)))))))
|
2003-11-23 20:56:10 +00:00
|
|
|
|
2017-02-10 14:53:02 -05:00
|
|
|
(defun rgrep-find-ignored-directories (dir)
|
|
|
|
"Return the list of ignored directories applicable to `dir'."
|
|
|
|
(delq nil (mapcar
|
|
|
|
(lambda (ignore)
|
|
|
|
(cond ((stringp ignore) ignore)
|
|
|
|
((consp ignore)
|
|
|
|
(and (funcall (car ignore) dir) (cdr ignore)))))
|
|
|
|
grep-find-ignored-directories)))
|
|
|
|
|
2015-06-02 18:46:42 +03:00
|
|
|
(defun rgrep-default-command (regexp files dir)
|
|
|
|
"Compute the command for \\[rgrep] to use by default."
|
|
|
|
(require 'find-dired) ; for `find-name-arg'
|
|
|
|
(grep-expand-template
|
|
|
|
grep-find-template
|
|
|
|
regexp
|
|
|
|
(concat (shell-quote-argument "(")
|
|
|
|
" " find-name-arg " "
|
|
|
|
(mapconcat
|
|
|
|
#'shell-quote-argument
|
|
|
|
(split-string files)
|
|
|
|
(concat " -o " find-name-arg " "))
|
|
|
|
" "
|
|
|
|
(shell-quote-argument ")"))
|
|
|
|
dir
|
|
|
|
(concat
|
|
|
|
(and grep-find-ignored-directories
|
|
|
|
(concat "-type d "
|
|
|
|
(shell-quote-argument "(")
|
|
|
|
;; we should use shell-quote-argument here
|
|
|
|
" -path "
|
2017-02-10 14:53:02 -05:00
|
|
|
(mapconcat (lambda (d) (shell-quote-argument (concat "*/" d)))
|
|
|
|
(rgrep-find-ignored-directories dir)
|
|
|
|
" -o -path ")
|
2015-06-02 18:46:42 +03:00
|
|
|
" "
|
|
|
|
(shell-quote-argument ")")
|
|
|
|
" -prune -o "))
|
|
|
|
(and grep-find-ignored-files
|
|
|
|
(concat (shell-quote-argument "!") " -type d "
|
|
|
|
(shell-quote-argument "(")
|
|
|
|
;; we should use shell-quote-argument here
|
|
|
|
" -name "
|
|
|
|
(mapconcat
|
|
|
|
#'(lambda (ignore)
|
|
|
|
(cond ((stringp ignore)
|
|
|
|
(shell-quote-argument ignore))
|
|
|
|
((consp ignore)
|
|
|
|
(and (funcall (car ignore) dir)
|
|
|
|
(shell-quote-argument
|
|
|
|
(cdr ignore))))))
|
|
|
|
grep-find-ignored-files
|
|
|
|
" -o -name ")
|
|
|
|
" "
|
|
|
|
(shell-quote-argument ")")
|
|
|
|
" -prune -o ")))))
|
|
|
|
|
2018-03-11 14:56:00 +01:00
|
|
|
(defun grep-find-toggle-abbreviation ()
|
|
|
|
"Toggle showing the hidden part of rgrep/lgrep/zrgrep command line."
|
2018-02-22 23:51:41 +02:00
|
|
|
(interactive)
|
2018-03-11 14:56:00 +01:00
|
|
|
(with-silent-modifications
|
|
|
|
(let* ((beg (next-single-property-change (point-min) 'abbreviated-command))
|
|
|
|
(end (when beg
|
|
|
|
(next-single-property-change beg 'abbreviated-command))))
|
|
|
|
(if end
|
|
|
|
(if (get-text-property beg 'display)
|
|
|
|
(remove-list-of-text-properties
|
|
|
|
beg end '(display help-echo mouse-face help-echo keymap))
|
|
|
|
(add-text-properties beg end grep-find-abbreviate-properties))
|
|
|
|
(user-error "No abbreviated part to hide/show")))))
|
2018-02-22 23:51:41 +02:00
|
|
|
|
2009-11-25 17:23:45 +00:00
|
|
|
;;;###autoload
|
2014-04-12 15:38:06 -04:00
|
|
|
(defun zrgrep (regexp &optional files dir confirm template)
|
2009-11-25 17:23:45 +00:00
|
|
|
"Recursively grep for REGEXP in gzipped FILES in tree rooted at DIR.
|
|
|
|
Like `rgrep' but uses `zgrep' for `grep-program', sets the default
|
2019-10-11 22:13:43 +02:00
|
|
|
file name to `*.gz', and sets `grep-highlight-matches' to `always'.
|
|
|
|
|
2019-10-12 09:52:03 +03:00
|
|
|
If CONFIRM is non-nil, the user will be given an opportunity to edit the
|
2019-10-11 22:13:43 +02:00
|
|
|
command before it's run."
|
2009-11-25 17:23:45 +00:00
|
|
|
(interactive
|
2010-01-31 23:47:47 +02:00
|
|
|
(progn
|
|
|
|
;; Compute standard default values.
|
2009-11-25 17:23:45 +00:00
|
|
|
(grep-compute-defaults)
|
2010-01-31 23:47:47 +02:00
|
|
|
;; Compute the default zrgrep command by running `grep-compute-defaults'
|
|
|
|
;; for grep program "zgrep", but not changing global values.
|
|
|
|
(let ((grep-program "zgrep")
|
|
|
|
;; Don't change global values for variables computed
|
|
|
|
;; by `grep-compute-defaults'.
|
|
|
|
(grep-find-template nil)
|
|
|
|
(grep-find-command nil)
|
|
|
|
(grep-host-defaults-alist nil)
|
2018-03-03 23:33:15 +02:00
|
|
|
;; `zgrep' doesn't support the `--null' option.
|
|
|
|
(grep-use-null-filename-separator nil)
|
2010-01-31 23:47:47 +02:00
|
|
|
;; Use for `grep-read-files'
|
|
|
|
(grep-files-aliases '(("all" . "* .*")
|
|
|
|
("gz" . "*.gz"))))
|
|
|
|
;; Recompute defaults using let-bound values above.
|
|
|
|
(grep-compute-defaults)
|
|
|
|
(cond
|
|
|
|
((and grep-find-command (equal current-prefix-arg '(16)))
|
|
|
|
(list (read-from-minibuffer "Run: " grep-find-command
|
|
|
|
nil nil 'grep-find-history)))
|
|
|
|
((not grep-find-template)
|
|
|
|
(error "grep.el: No `grep-find-template' available"))
|
|
|
|
(t (let* ((regexp (grep-read-regexp))
|
|
|
|
(files (grep-read-files regexp))
|
|
|
|
(dir (read-directory-name "Base directory: "
|
|
|
|
nil default-directory t))
|
|
|
|
(confirm (equal current-prefix-arg '(4))))
|
|
|
|
(list regexp files dir confirm grep-find-template)))))))
|
2015-06-28 04:38:11 +03:00
|
|
|
(let ((grep-find-template template)
|
|
|
|
;; Set `grep-highlight-matches' to `always'
|
|
|
|
;; since `zgrep' puts filters in the grep output.
|
|
|
|
(grep-highlight-matches 'always))
|
2009-11-25 17:23:45 +00:00
|
|
|
(rgrep regexp files dir confirm)))
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defalias 'rzgrep 'zrgrep)
|
2003-11-23 20:56:10 +00:00
|
|
|
|
|
|
|
(provide 'grep)
|
|
|
|
|
2004-02-15 13:15:07 +00:00
|
|
|
;;; grep.el ends here
|