Fix rgrep in dired using directory for search file pattern

* lisp/progmodes/grep.el (grep-read-files): Allow major modes to
define file name to use for default search pattern.
Add non-directory file at point as default search pattern candidate.

* lisp/dired.el (dired-grep-read-files): Use non-directory file at
point for grep file name pattern.  (Bug#34621)

Copyright-paperwork-exempt: yes
This commit is contained in:
Christopher Thorne 2019-04-11 23:51:13 +03:00 committed by Juri Linkov
parent 382a508ed2
commit de238b39e3
2 changed files with 19 additions and 2 deletions

View file

@ -774,6 +774,15 @@ as an argument to `dired-goto-file'."
(file-name-as-directory (abbreviate-file-name filename))
(abbreviate-file-name filename)))))
(defun dired-grep-read-files ()
"Use file at point as the file for grep's default file-name pattern suggestion.
If a directory or nothing is found at point, return nil."
(let ((file-name (dired-file-name-at-point)))
(if (and file-name
(not (file-directory-p file-name)))
file-name)))
(put 'dired-mode 'grep-read-files 'dired-grep-read-files)
;;;###autoload (define-key ctl-x-map "d" 'dired)
;;;###autoload
(defun dired (dirname &optional switches)

View file

@ -959,8 +959,16 @@ substitution string. Note dynamic scoping of variables.")
The pattern can include shell wildcards. As whitespace triggers
completion when entering a pattern, including it requires
quoting, e.g. `\\[quoted-insert]<space>'."
(let* ((bn (or (buffer-file-name)
(replace-regexp-in-string "<[0-9]+>\\'" "" (buffer-name))))
(let* ((grep-read-files-function (get major-mode 'grep-read-files))
(file-name-at-point
(run-hook-with-args-until-success 'file-name-at-point-functions))
(bn (if grep-read-files-function
(funcall grep-read-files-function)
(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)))))
(fn (and bn
(stringp bn)
(file-name-nondirectory bn)))