Function: projectile-grep
projectile-grep is an autoloaded, interactive and byte-compiled
function defined in projectile.el.
Signature
(projectile-grep &optional REGEXP ARG)
Documentation
Perform rgrep in the project.
With a prefix ARG asks for files (globbing-aware) which to grep in.
With prefix ARG of - (such as M--), default the files (without prompt),
to projectile-grep-default-files.
With REGEXP given, don't query the user for a regexp.
Key Bindings
Source Code
;; Defined in ~/.emacs.d/elpa/projectile-20260310.858/projectile.el
;;;###autoload
(defun projectile-grep (&optional regexp arg)
"Perform rgrep in the project.
With a prefix ARG asks for files (globbing-aware) which to grep in.
With prefix ARG of `-' (such as `M--'), default the files (without prompt),
to `projectile-grep-default-files'.
With REGEXP given, don't query the user for a regexp."
(interactive "i\nP")
(require 'grep) ;; for `rgrep'
(let* ((roots (projectile-get-project-directories (projectile-acquire-root)))
(search-regexp (or regexp
(projectile--read-search-string-with-default "Grep for")))
(files (and arg (or (and (equal current-prefix-arg '-)
(projectile-grep-default-files))
(read-string (projectile-prepend-project-name "Grep in: ")
(projectile-grep-default-files))))))
(dolist (root-dir roots)
(require 'vc-git) ;; for `vc-git-grep'
;; in git projects users have the option to use `vc-git-grep' instead of `rgrep'
(if (and (eq (projectile-project-vcs) 'git)
projectile-use-git-grep)
(vc-git-grep search-regexp (or files "") root-dir)
;; paths for find-grep should relative and without trailing /
;; TODO: Replace seq-uniq+append with seq-union when Emacs 28.1 is the minimum version
(let ((grep-find-ignored-files
(seq-uniq (append (projectile--globally-ignored-file-suffixes-glob)
grep-find-ignored-files)))
(projectile-grep-find-ignored-paths
(append (mapcar (lambda (f) (directory-file-name (file-relative-name f root-dir)))
(projectile-ignored-directories))
(mapcar (lambda (file)
(file-relative-name file root-dir))
(projectile-ignored-files))))
(projectile-grep-find-unignored-paths
(append (mapcar (lambda (f) (directory-file-name (file-relative-name f root-dir)))
(projectile-unignored-directories))
(mapcar (lambda (file)
(file-relative-name file root-dir))
(projectile-unignored-files))))
(projectile-grep-find-ignored-patterns (projectile-patterns-to-ignore))
(projectile-grep-find-unignored-patterns (projectile-patterns-to-ensure)))
(grep-compute-defaults)
(cl-letf (((symbol-function 'rgrep-default-command) #'projectile-rgrep-default-command))
(rgrep search-regexp (or files "* .*") root-dir)
(when (get-buffer "*grep*")
;; When grep is using a global *grep* buffer rename it to be
;; scoped to the current root to allow multiple concurrent grep
;; operations, one per root
(with-current-buffer "*grep*"
(rename-buffer (concat "*grep <" root-dir ">*") t)))))))
(run-hooks 'projectile-grep-finished-hook)))