From: Dmitry Gutov Date: Thu, 26 Dec 2019 15:39:48 +0000 (+0200) Subject: Speed up dired-do-find-regexp X-Git-Tag: emacs-27.0.90~278 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ccd7cd2c51c8a3755b084f93ae3a66a3df8a42f0;p=emacs.git Speed up dired-do-find-regexp * lisp/dired-aux.el (dired-do-find-regexp): Speed up (bug#36857). Previously, 'find' was called for every marked file (for plain files and directories both). Now 'find' is only called for directories. --- diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el index fb1ad6266d6..ce967b0735f 100644 --- a/lisp/dired-aux.el +++ b/lisp/dired-aux.el @@ -2957,6 +2957,8 @@ with the command \\[tags-loop-continue]." (declare-function xref--show-xrefs "xref") (declare-function xref-query-replace-in-results "xref") +(declare-function project--files-in-directory "project") +(declare-function project--find-regexp-in-files "project") ;;;###autoload (defun dired-do-find-regexp (regexp) @@ -2975,19 +2977,24 @@ REGEXP should use constructs supported by your local `grep' command." (require 'xref) (defvar grep-find-ignored-files) (declare-function rgrep-find-ignored-directories "grep" (dir)) - (let* ((files (dired-get-marked-files nil nil nil nil t)) + (let* ((marks (dired-get-marked-files nil nil nil nil t)) (ignores (nconc (mapcar #'file-name-as-directory (rgrep-find-ignored-directories default-directory)) grep-find-ignored-files)) (fetcher (lambda () - (let ((xrefs (mapcan - (lambda (file) - (xref-collect-matches regexp "*" file - (and (file-directory-p file) - ignores))) - files))) + (let (files xrefs) + (mapc + (lambda (mark) + (if (file-directory-p mark) + (setq files (nconc + (project--files-in-directory mark ignores "*") + files)) + (push mark files))) + (nreverse marks)) + (setq xrefs + (project--find-regexp-in-files regexp files)) (unless xrefs (user-error "No matches for: %s" regexp)) xrefs))))