| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-07-12 | 8.2 kB | |
| v3.2.0 source code.tar.gz | 2026-07-12 | 2.2 MB | |
| v3.2.0 source code.zip | 2026-07-12 | 2.2 MB | |
| Totals: 3 Items | 4.4 MB | 0 | |
New features
- Add reviewable read-only search commands, a search-only sibling of the reviewable replace UI.
projectile-search-review(s R) searches for a literal string;projectile-search-regexp-review(s X) searches for an Emacs regexp, honoring full Emacs regexp syntax.- Matches are gathered into a read-only
*projectile-search*buffer, grouped by file, oneLINE:COL: CONTEXTline per match with the matched span highlighted; there is no preview, no per-match toggle and no apply. - The buffer reuses the replace reviewer's navigation, case/regexp toggles (
c/x), line and file filters (k/d/K/D), re-search (g) and grep-mode export (e). rbridges the current search to the replace reviewer, carrying over the term, literal-ness and case setting and prompting only for the replacement.- A literal
projectile-search-reviewaccelerates its scan with ripgrep whenrgis installed, streaming matches in near-instantly on large projects.- Controlled by
projectile-search-use-ripgrep(default on); set it to nil to always use the pure-elisp scan. - The ripgrep fast-path follows ripgrep's ignore rules plus Projectile's ignore globs, which can differ slightly from the elisp path's file set (e.g. hidden files, symlinks); regexp search and the whole replace reviewer always use the portable elisp scan.
- Controlled by
- The commands are available from
projectile-dispatchand the Projectile menu. - #1924: Add reviewable project-wide replace commands that let you preview matches and choose which to apply, instead of the blocking, file-by-file
query-replacewalk ofprojectile-replace. projectile-replace-review(R) does a literal replace;projectile-replace-regexp-reviewdoes an Emacs-regexp replace whose replacement can reference capture groups.- Matches are gathered in Emacs Lisp, so the regexp command honors full Emacs regexp syntax and the preview reflects exactly what will be edited, including unsaved changes in open buffers.
- The
*projectile-replace*results buffer shows a per-file, per-match preview where each match can be toggled on or off;!(orC-c C-c) applies just the enabled ones, in any order. - Applying edits each file from the bottom up, edits open buffers in place under a single undo step, writes closed files back preserving their coding system, and skips buffers modified since the search rather than corrupting them.
- The results buffer can reshape the search in place, each action re-scanning and re-rendering the previews:
ctoggles case sensitivity (seeded fromcase-fold-search).xtoggles between literal and Emacs-regexp matching, refusing an invalid regexp rather than erroring.k/dkeep or flush the matches whose line matches a regexp;K/Ddo the same by file name; re-searching withgrestores anything filtered away.
- A status line at the top shows the term, replacement, match and file counts, the mode flags, and a note when the list has been filtered.
eexports the shown matches to agrep-modebuffer so wgrep or Emacs 31'sgrep-edit-modecan turn them editable and write back; wgrep stays an optional integration and!remains the no-dependency apply path.- Both reviewers scan the project asynchronously, so a large search no longer freezes Emacs.
- The results buffer opens right away, matches stream in as they're found (the header shows a "Searching..." progress note), and the scan is cancelable with
q,C-g, or by killing the buffer. - While a scan is still running,
!(apply),e(export) and the filter keys (k/d/K/D) refuse until it finishes, so the write-back never runs against a partial match set and a filter can't be outrun by a later chunk; starting a new scan (g/c/x) cancels any in-flight one. - Set
projectile-replace-asyncto nil to force the old synchronous single-pass scan; batch runs always scan synchronously.
- The results buffer opens right away, matches stream in as they're found (the header shows a "Searching..." progress note), and the scan is cancelable with
- The commands are available from
projectile-dispatchand the Projectile menu, and the match cap is customizable viaprojectile-replace-max-matches. - Add
projectile-session-mode, a global minor mode that gives each project its owntab-bartab. - Switching to a project selects its existing tab (restoring that project's window layout) when one is open, or otherwise opens a fresh tab named after the project and populated via
projectile-session-default-action. - Same-named checkouts get distinct tab names (e.g.
work/fooandhome/foo); customize the scheme withprojectile-session-tab-name-function. projectile-session-switch-to-buffercompletes over just the current tab's project buffers.- Sessions persist across Emacs restarts:
projectile-session-save,projectile-session-restoreandprojectile-session-forgetwrite a project's window layout and buffers to a file underprojectile-session-directoryand read it back;projectile-session-save-allsaves every open project at once. - Switching to a project with a saved session restores it (gated by
projectile-session-restore-on-switch);projectile-session-autosavesaves sessions on switch-away and on exit. projectile-session-restore-allreopens every saved project's session, each into its own tab (skipping projects already open and dropping stale sessions whose files are gone); setprojectile-session-restore-on-startupto run it automatically at Emacs startup.- Which buffers are recorded, and how, is extensible via
projectile-session-buffer-serializers; file-visiting anddired-modebuffers work out of the box. - The session commands are bound under the
wsub-prefix of the command map (s-p w s,s-p w S,s-p w r,s-p w R,s-p w f,s-p w b), and are also available fromprojectile-dispatchand the Projectile menu.
Changes
- Add
projectile-frecency-max-projects(default 100), which caps how many projects' frecency history is kept so the store can't grow without bound. projectile-replace-scan-chunk-sizeis now a user-facingdefcustom(was an internal variable).- Advertise the right completion metadata category per command so marginalia and embark annotate and act on candidates correctly: buffer switching now uses the
buffercategory (so marginalia shows its rich buffer annotations), project switching usesfile, and file commands keepproject-file- previously every completion was hardcoded toproject-file.projectile-completing-readgained a:categorykeyword for this. - Add whole-word matching to the reviewable search/replace: toggle it with
win the results buffer, default it withprojectile-search-whole-word, or seed it for one run with theprojectile-dispatch--wordswitch. The elisp scan fences the pattern with word boundaries and the ripgrep fast-path passes--word-regexp, so both engines agree. - Wire the reviewable search/replace into the
projectile-dispatchModifiers: the two literal/regexp search entries are folded into onesRdriven by--regexp(matching how--regexpalready drives the ag/ripgrep search), and a new--case-sensitiveswitch seeds the reviewable search/replace case-sensitive. Both can still be flipped withx/cin the results buffer. - Highlight the search tool and the default value in the search prompts, and give them one consistent
Search [tool] for (default: X)format acrossprojectile-search,projectile-grep/-ag/-ripgrepand the reviewable search. The tool that will run (grep/ag/ripgrep, orripgrep/elispfor the reviewable search's literal fast-path) is faced withprojectile-search-prompt-tooland the symbol-at-point default withprojectile-search-prompt-default. The reviewable search now also shows its default up front and which engine it will use.