aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBozhidar Batsov <bozhidar@batsov.dev>2026-02-14 22:17:37 +0200
committerBozhidar Batsov <bozhidar@batsov.dev>2026-02-14 22:17:37 +0200
commit9ca36353567a020fec42e76ee03cd87fff3034a8 (patch)
treeb6b21e69e94788a31b78db3ec5c997da0bf1ff16
parent446886481850d8cfa3fc09b7fbcc7f3cbdc967e8 (diff)
Add compat dependency and adopt modern Emacs APIs
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
-rw-r--r--CHANGELOG.md1
-rw-r--r--projectile.el17
2 files changed, 7 insertions, 11 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7cf63dc..ebd7346 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -35,6 +35,7 @@
### Changes
* **[Breaking]** Bump minimum required Emacs version from 26.1 to 27.1. This removes ~30 lines of compatibility code (fileloop fallback, `time-convert` fallback, `projectile-flatten` shim) and fixes the `tags-query-replace` FIXME in `projectile-replace-regexp`.
+* Add `compat` as a dependency, enabling the use of modern Emacs APIs (e.g. `string-replace`) on older Emacs versions.
* [#1958](https://github.com/bbatsov/projectile/issues/1958): Exclude `.projectile-cache.eld` from search results (ripgrep/ag/grep) by default.
* [#1957](https://github.com/bbatsov/projectile/pull/1957): Add `:caller` information to calls to `ivy-read` (used by packages like `ivy-rich`).
* [#1947](https://github.com/bbatsov/projectile/issues/1947): `projectile-project-name` should be marked as safe.
diff --git a/projectile.el b/projectile.el
index 8f22443..db6bdbb 100644
--- a/projectile.el
+++ b/projectile.el
@@ -6,7 +6,7 @@
;; URL: https://github.com/bbatsov/projectile
;; Keywords: project, convenience
;; Version: 2.9.1
-;; Package-Requires: ((emacs "27.1"))
+;; Package-Requires: ((emacs "27.1") (compat "30"))
;; This file is NOT part of GNU Emacs.
@@ -36,6 +36,7 @@
;;; Code:
(require 'cl-lib)
+(require 'compat)
(require 'thingatpt)
(require 'ibuffer)
(require 'ibuf-ext)
@@ -3983,8 +3984,7 @@ Replace STRING in DIR-PATH with REPLACEMENT."
(let* ((project-root (projectile-project-root))
(relative-dir (file-name-directory (file-relative-name dir-path project-root))))
(projectile-expand-root
- ;; TODO: Use string-replace once we target emacs 28
- (replace-regexp-in-string string replacement relative-dir t))))
+ (string-replace string replacement relative-dir))))
(defun projectile--create-directories-for (path)
"Create directories necessary for PATH."
@@ -4572,8 +4572,7 @@ installed to work."
A thin wrapper around `xref-references-in-directory'."
(interactive)
- (when (and (fboundp 'xref-references-in-directory)
- (fboundp 'xref--show-xrefs))
+ (when (fboundp 'xref--show-xrefs)
(let ((project-root (projectile-acquire-root))
(symbol (or symbol (read-from-minibuffer "Lookup in project: " (projectile-symbol-at-point)))))
(xref--show-xrefs (xref-references-in-directory symbol project-root) nil))))
@@ -4632,13 +4631,9 @@ A thin wrapper around `xref-references-in-directory'."
(cond
((fboundp 'ggtags-find-tag-dwim)
'ggtags-find-tag-dwim)
- ((fboundp 'xref-find-definitions)
- 'xref-find-definitions)
- ((fboundp 'etags-select-find-tag)
- 'etags-select-find-tag)))
+ (t 'xref-find-definitions)))
((eq projectile-tags-backend 'xref)
- (when (fboundp 'xref-find-definitions)
- 'xref-find-definitions))
+ 'xref-find-definitions)
((eq projectile-tags-backend 'ggtags)
(when (fboundp 'ggtags-find-tag-dwim)
'ggtags-find-tag-dwim))