Function: projectile-replace--export
projectile-replace--export is an interactive and byte-compiled
function defined in projectile.el.
Signature
(projectile-replace--export)
Documentation
Export the enabled matches to a grep-mode buffer for editing with wgrep.
Renders the matches Projectile's own apply command would act on (the
enabled matches from the reviewed and filtered list; ones toggled off are
excluded, just as they are by apply) as standard RELPATH:LINE:CONTEXT grep
hits in a *projectile-grep* buffer whose default-directory is
the project root, so the relative paths resolve. The buffer is a real
grep-mode buffer navigable with next-error and RET, so wgrep
(wgrep-change-to-wgrep-mode, bound to \C-c C-p) or Emacs 31's
grep-edit-mode can turn it editable and write your edits back to the
files. This is the bridge for people who prefer the grep/wgrep workflow;
Projectile's own apply command
(! (projectile-replace--apply)) is the no-dependency path and needs no external package.
Key Bindings
Source Code
;; Defined in ~/.emacs.d/elpa/projectile-20260820.1509/projectile.el
(defun projectile-replace--export ()
"Export the enabled matches to a `grep-mode' buffer for editing with wgrep.
Renders the matches Projectile's own apply command would act on (the
enabled matches from the reviewed and filtered list; ones toggled off are
excluded, just as they are by apply) as standard RELPATH:LINE:CONTEXT grep
hits in a `*projectile-grep*' buffer whose `default-directory' is
the project root, so the relative paths resolve. The buffer is a real
`grep-mode' buffer navigable with `next-error' and RET, so wgrep
(`wgrep-change-to-wgrep-mode', bound to \\`C-c C-p') or Emacs 31's
`grep-edit-mode' can turn it editable and write your edits back to the
files. This is the bridge for people who prefer the grep/wgrep workflow;
Projectile's own apply command
(\\<projectile-replace-mode-map>\\[projectile-replace--apply]) is the no-dependency path and needs no external package."
(interactive)
(projectile-replace--ensure-not-scanning)
(require 'grep)
(let ((matches (cl-remove-if-not #'projectile-replace--match-enabled
projectile-replace--matches))
(root projectile-replace--root)
;; label the export by which reviewer it came from (read here, before
;; switching to the grep buffer, so `major-mode' is the source buffer's)
(kind (if (derived-mode-p 'projectile-search-mode) "search" "replace"))
(buf (get-buffer-create projectile--grep-export-buffer-name)))
(when (null matches)
(user-error "No enabled matches to export"))
(with-current-buffer buf
(let ((inhibit-read-only t))
(erase-buffer)
(setq default-directory root)
(insert (format "-*- mode: grep; default-directory: %S -*-\n\n" root))
;; No colon before a value here: the search term could be `10:30' and
;; would otherwise parse as a phantom `file:line:' grep hit.
(insert (format "Projectile %s (%d match%s)\n\n"
kind (length matches)
(if (= (length matches) 1) "" "es")))
(dolist (m matches)
(insert (projectile-replace--grep-line m root) "\n"))
(insert (format "\nProjectile %s export finished\n" kind)))
(grep-mode)
;; keep the root as default-directory so the relative hits resolve
(setq default-directory root)
;; let wgrep hook up its keys if the user has it; strictly optional
(when (fboundp 'wgrep-setup) (wgrep-setup))
(goto-char (point-min)))
(pop-to-buffer buf)
(projectile-replace--export-guidance)
buf))