From 9ca36353567a020fec42e76ee03cd87fff3034a8 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Sat, 14 Feb 2026 22:17:37 +0200 Subject: 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 --- CHANGELOG.md | 1 + projectile.el | 17 ++++++----------- 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)) -- cgit v1.0