aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2026-02-15Support %p placeholder for project name in command stringsfeature/1698-project-name-placeholderBozhidar Batsov
Closes #1698 All project command strings (configure, compile, test, run, install, package) now support %p as a placeholder that gets replaced with the project name at execution time. This is useful for commands like "docker exec %p make test" where the container name matches the project name.
2026-02-15Bump the dev versionBozhidar Batsov
2026-02-15Fix hardcoded git command in sub-projects and add hg/svn ignored commandsBozhidar Batsov
- Use VCS-appropriate command in projectile-get-sub-projects-files instead of hardcoding projectile-git-command. - Add projectile-hg-ignored-command and projectile-svn-ignored-command defcustoms so ignored-file filtering works for hg and svn projects in native/hybrid indexing mode.
2026-02-15Add TODOs for seq-union and seq-keep when minimum Emacs is bumpedBozhidar Batsov
seq-union requires Emacs 28.1+ and seq-keep requires Emacs 29.1+.
2026-02-15Replace seq-union with seq-uniq + append for Emacs 27 compatibilityBozhidar Batsov
seq-union is not available in Emacs 27's built-in seq.el. Use (seq-uniq (append ...)) which achieves the same result.
2026-02-15Add declare-function for vc-git-grepBozhidar Batsov
The fboundp guard was removed but vc-git is only loaded at runtime, so the byte-compiler needs a declare-function to avoid a warning.
2026-02-15Revert seq-keep usage; not available via compat on Emacs 27Bozhidar Batsov
seq-keep was added in Emacs 29.1 and is not provided by the compat package. Revert to (delq nil (mapcar ...)) which works on all supported Emacs versions.
2026-02-15Remove unused function projectile-files-in-project-directoryBozhidar Batsov
This function was defined but never called anywhere in the codebase.
2026-02-15Replace (delq nil (mapcar ...)) with seq-keepBozhidar Batsov
Use seq-keep (available via compat 30) for the filter-map pattern in projectile-normalise-paths, projectile-rgrep-default-command, and projectile-open-projects.
2026-02-15Replace delete-dups with seq-uniqBozhidar Batsov
Use the non-destructive seq-uniq instead of delete-dups across 9 call sites for consistency with the seq.el migration.
2026-02-15Remove unnecessary fboundp guard and declare-functionBozhidar Batsov
- Remove (fboundp 'vc-git-grep) check since (require 'vc-git) is called right before it, making the function always available. - Remove (declare-function string-trim "subr-x") since string-trim is unconditionally available via compat 30.
2026-02-15Clean up minor Emacs Lisp idiomsBozhidar Batsov
- Replace (nth 0/1/2 ...) with car/cadr/caddr - Replace (unless (equal ... nil) ...) with (when ...) - Replace (> (length x) n) with (length> x n) (via compat 30)
2026-02-15Use string-remove-prefix and string-remove-suffixBozhidar Batsov
Replace manual (if (string-prefix-p "./" f) (substring f 2) f) with (string-remove-prefix "./" f), and (equal (substring dir -1) "/") with string-remove-suffix. Both are available via compat 30.
2026-02-15Replace (cdr (assoc ...)) with alist-getBozhidar Batsov
Use the more idiomatic alist-get accessor instead of the (cdr (assoc ...)) pattern across ~15 call sites in cmake helpers and search command constructors.
2026-02-14Replace cl-lib sequence functions with seq.el equivalentsBozhidar Batsov
Migrate cl-remove-if-not → seq-filter, cl-remove-if → seq-remove, cl-some → seq-some, cl-every → seq-every-p, cl-find-if → seq-find, cl-mapcan → mapcan, cl-union → seq-union, cl-sort → seq-sort, cl-case → pcase, and delete projectile-difference in favor of seq-difference. Manual replacements for cl-notany, cl-typep, cl-incf, cl-remove, and cl-subst. cl-lib is still required for cl-defun, cl-defmethod, cl-loop, cl-letf, and cl-flet*.
2026-02-14Add GNU ELPA to Eldev package archivesBozhidar Batsov
The compat package is hosted on GNU ELPA, not MELPA. Add GNU ELPA to the Eldev configuration so CI can resolve the dependency.
2026-02-14Add compat dependency and adopt modern Emacs APIsBozhidar Batsov
Add (compat "30") as a dependency, which backports newer Emacs functions to older versions with zero overhead on modern Emacs. Changes enabled by compat: - Use string-replace instead of replace-regexp-in-string for literal replacements (resolves TODO in projectile-complementary-dir) Also simplified version-conditional code now safe with Emacs 27.1+: - Remove redundant fboundp check for xref-references-in-directory - Remove redundant fboundp check for xref-find-definitions - Simplify auto tags backend to prefer ggtags then xref
2026-02-14Bump minimum Emacs version from 26.1 to 27.1Bozhidar Batsov
Emacs 27.1 was released nearly 6 years ago (August 2020). Bumping the minimum version lets us remove ~30 lines of compatibility code: - Remove fileloop fallback using deprecated tags-loop-scan/operate - Fix tags-query-replace FIXME in projectile-replace-regexp by using fileloop-initialize-replace + fileloop-continue - Replace projectile-flatten with built-in flatten-tree (6 call sites) - Simplify projectile-time-seconds to just (time-convert nil 'integer) - Use proper-list-p for known-projects file validation - Use json-parse-buffer unconditionally in CMake preset reader - Use package-get-version unconditionally - Add (require 'fileloop) as a proper dependency - Drop Emacs 26.3 from CI matrix
2026-02-14Add missing CHANGELOG entries for undocumented changes since v2.9.1Bozhidar Batsov
Document 8 user-visible changes that were missing: - #1964: project.el project-name and project-buffers integration - #1962: fix other-file crash for root directory files - projectile-add-known-project keybinding (A) and menu entry - projectile-ripgrep glob quoting fix for zsh - CMake version parsing robustness - Jujutsu file listing template syntax - build.mill as Mill project marker - Emacs 31+ compatibility (obsolete macro replacements)
2026-02-14Fix wildcard expansion in unreadable dirs and compilation-buffer-name-functionBozhidar Batsov
- Wrap file-expand-wildcards in ignore-errors so project root detection works when parent directories are not readable, e.g. on iCloud Drive or Termux (#1816) - Preserve the user's compilation-buffer-name-function instead of unconditionally binding it to nil in projectile--run-project-cmd, so custom buffer naming works when projectile-per-project-compilation-buffer is nil (#1841)
2026-02-14Fix grep hook, replace-regexp on missing files, and corrupt bookmarksBozhidar Batsov
- Pass unique=t to rename-buffer in projectile-grep so subsequent greps don't fail with "buffer name in use", which prevented projectile-grep-finished-hook from running (#1687) - Filter nonexistent files from projectile-replace-regexp file list to avoid stopping on deleted files (#1456) - Validate that deserialized known-projects data is a proper list, gracefully handling corrupted bookmarks files (#1939)
2026-02-14Fix mode-line in non-file buffers and nil project root crashBozhidar Batsov
- Update the mode-line via window-configuration-change-hook so non-file buffers like Magit display correct project info (#1823) - Use projectile-acquire-root instead of projectile-project-root in projectile--run-project-cmd to prevent wrong-type-argument error when running commands in newly created projects (#1886)
2026-02-14Fix projectile-root-top-down to search top-down, not bottom-up (#1729)Bozhidar Batsov
projectile-root-top-down used projectile-locate-dominating-file which stops at the first (bottommost) match going up the directory tree. This made it behave identically to projectile-root-bottom-up. Add projectile-locate-dominating-file-top-down which walks the entire directory hierarchy and returns the topmost match. For example, with nested Makefiles at both project/ and project/subdir/, searching from project/subdir/ now correctly returns project/ instead of project/subdir/.
2026-02-14Include intermediate directories in projectile-find-dir (#1596)Bozhidar Batsov
projectile-project-dirs previously only returned directories that directly contain files, missing intermediate directories that contain only subdirectories (e.g. src/ when it only has src/ComponentA/). Fix by walking each file path's ancestor directories up to the project root, so all intermediate directories are included.
2026-02-14Don't cache nonexistent files & fix grep/git-grep with special chars (#1551, ↵Bozhidar Batsov
#1554) Two unrelated small fixes: 1. projectile-cache-current-file now checks file-exists-p before adding a file to the cache. This prevents ghost entries when visiting a new file with find-file and abandoning the buffer without saving. 2. Add -F (fixed-string) flag to the grep and git-grep commands used by projectile-files-with-string, matching what rg, ag, and ack already do. This fixes errors when the search string contains regex special characters like [ ] and @.
2026-02-14Fix projectile-replace on Emacs 27+ (#1748, #1741)Bozhidar Batsov
Two bugs in projectile-replace: 1. fileloop is autoloaded but never required, so (fboundp #'fileloop-continue) returns nil and the function falls back to the legacy Emacs 25/26 code path even on Emacs 27+. Fix by requiring fileloop before the check. 2. fileloop-initialize-replace expects a regexp, but projectile-replace is documented to do literal replacement. Fix by wrapping the search term with regexp-quote.
2026-02-13Bump GitHub Actions to latest versionsBozhidar Batsov
- actions/checkout v4 -> v6 - actions/stale v9 -> v10
2026-02-13Document moderate-priority undocumented configuration optionsBozhidar Batsov
- VCS commands: table of all per-VCS command variables, plus projectile-git-submodule-command and projectile-git-ignored-command - Caching: projectile-files-cache-expire - Tags: projectile-tags-file-name, projectile-tags-backend - Searching: projectile-use-git-grep - Project name: projectile-project-name-function - Dirty projects: projectile-vcs-dirty-state - Hooks: projectile-find-file-hook, projectile-find-dir-hook, projectile-before-switch-project-hook - Misc: projectile-verbose, projectile-show-menu - Ignore/unignore: projectile-globally-ignored-file-suffixes, projectile-global-ignore-file-patterns, projectile-globally-unignored-files, projectile-globally-unignored-directories
2026-02-13Document previously undocumented configuration optionsBozhidar Batsov
- fd integration: projectile-git-use-fd, projectile-fd-executable, projectile-git-fd-args - Known projects: projectile-known-projects-file, projectile-ignored-projects, projectile-ignored-project-function, projectile-track-known-projects-automatically - Buffer filtering: projectile-buffers-filter-function, projectile-kill-buffers-filter - Test/impl toggling: projectile-default-src-directory, projectile-default-test-directory, projectile-test-prefix-function, projectile-test-suffix-function, projectile-create-missing-test-files
2026-02-13Minor cleanup of the #1897 fixBozhidar Batsov
- Use cl-remove-if instead of seq-remove for consistency with the rest of the codebase. - Remove unnecessary project/.git/ from test fixture (git init creates it). - Remove unnecessary projectile-indexing-method binding in test.
2026-02-13Filter deleted-but-unstaged files from git ls-files output (#1897)Bozhidar Batsov
When fd is unavailable or disabled, `git ls-files -zco --exclude-standard` returns files still tracked in the index even if deleted from disk. This causes projectile-dir-files-alien to list ghost files. Fix by running `git ls-files -zd` and removing those entries from the result.
2026-02-13Skip unreadable directories in projectile-index-directory (#1873)Bozhidar Batsov
Wrap the directory-files call in ignore-errors so that unreadable directories (e.g. .Spotlight-V100 on macOS) are silently skipped instead of aborting the entire native indexing operation.
2026-02-13Strip "./" prefix from fd output in projectile-files-via-ext-commandBozhidar Batsov
Newer fd versions (8.3.0+) prepend "./" to output. The --strip-cwd-prefix flag was already added to projectile-generic-command and projectile-git-fd-args, but this flag doesn't exist in older fd versions, causing errors. Add post-processing in projectile-files-via-ext-command to strip the "./" prefix from results as a defensive fallback, matching the existing pattern in projectile-files-from-cmd. Fixes #1749
2026-02-13Prevent directories from matching file-type project root markersBozhidar Batsov
On case-insensitive filesystems (macOS default), a ~/workspace directory matches the "WORKSPACE" Bazel marker because file-exists-p returns t for both files and directories. This causes the home directory to be falsely detected as a Bazel project root, leading to severe performance issues. Add a (not (file-directory-p ...)) guard in projectile-root-top-down so that only regular files can satisfy file-type marker checks. Fixes #1961
2026-02-13Fix typos in the markdown filesBozhidar Batsov
2026-02-13Fix typos in the documentationBozhidar Batsov
2026-02-13Fix typos in docstrings and commentsBozhidar Batsov
2026-01-09Fix the changelogBozhidar Batsov
2026-01-09Add projectile-cache-file to projectile-globally-ignored-files default (#1966)take
- Include projectile-cache-file in projectile-globally-ignored-files default - Add :safe predicate to allow dir-locals configuration - Add tests for default values and :safe predicate validation - Update related file and test matching functions to use let* variants - Improve variable binding consistency and future compatibility
2026-01-09Move a changelog entry where it belongsBozhidar Batsov
2026-01-09Bump the copyright yearsBozhidar Batsov
2026-01-09Tweak the changelogBozhidar Batsov
2026-01-07[Fix #1962] Fix finding other file when candidate is a root fileTroy Figiel
2026-01-07Add changelog linkThibaut Verron
2026-01-07Add caller identification to projectile-completing-read for ivyThibaut Verron
2026-01-07[Fix #1964] Implement project-name and project-buffersSpencer Baugh
This makes code using project.el APIs work better with projectile projects.
2026-01-07Support eat terminalPhilippe Vaucher
2026-01-07Avoid obsolete macrosPhilippe Vaucher
Emacs 31.1 treats when-let and cl-gensym as obsolete errors during byte-compilation, so switch to when-let* and gensym to keep snapshot CI green.
2026-01-07ci: add emacs 30.2Philippe Vaucher
2026-01-07ci: update emacs stable versionsPhilippe Vaucher