From 4fcf3327491551b022ac4ad94d342bc05f0fdd69 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 9 Aug 2024 20:54:23 -0400 Subject: [PATCH] refactor: generalize fd/ripgrep vars & options I intend to eventually replace projectile with project.el, so these doom-projectile-* variables need to be generalized, starting with the fd/ripgrep executable paths. ALong with that, this refactors Doom's projectile-generic-command to lean more on built-in fd support in projectile, where possible (fewer wheels reinvented). Ref: doomemacs/core#1 --- lisp/cli/doctor.el | 2 +- lisp/doom-projects.el | 69 +++++++++++-------- modules/completion/ivy/config.el | 2 +- .../completion/vertico/autoload/vertico.el | 6 +- modules/emacs/dired/config.el | 2 +- 5 files changed, 48 insertions(+), 33 deletions(-) diff --git a/lisp/cli/doctor.el b/lisp/cli/doctor.el index 5b4ecd5dc..62a3246e6 100644 --- a/lisp/cli/doctor.el +++ b/lisp/cli/doctor.el @@ -219,7 +219,7 @@ in." file (/ size 1024 1024.0)) (explain! "Consider deleting it from your system (manually)")))) - (unless (ignore-errors (executable-find doom-projectile-fd-binary)) + (unless (ignore-errors (executable-find doom-fd-executable)) (warn! "Couldn't find the `fd' binary; project file searches will be slightly slower")) (require 'projectile) diff --git a/lisp/doom-projects.el b/lisp/doom-projects.el index 25c1851ba..4b1e1aa2a 100644 --- a/lisp/doom-projects.el +++ b/lisp/doom-projects.el @@ -12,12 +12,17 @@ Emacs.") (defvar doom-projectile-cache-purge-non-projects nil "If non-nil, non-projects are purged from the cache on `kill-emacs-hook'.") -(defvar doom-projectile-fd-binary - (cl-find-if #'executable-find (list "fdfind" "fd")) - "The filename of the `fd' executable. On some distros it's 'fdfind' (ubuntu, -debian, and derivatives). On most it's 'fd'.") +(define-obsolete-variable-alias 'doom-projectile-fd-binary 'doom-fd-executable "v3.0.0") +(defvar doom-fd-executable (cl-find-if #'executable-find (list "fdfind" "fd")) + "The filename of the fd executable. -(defvar doom-projects--fd-version nil) +On some distros it's fdfind (ubuntu, debian, and derivatives). On most it's fd. +Is nil if no executable is found in your PATH during startup.") + +(defvar doom-ripgrep-executable (executable-find "rg") + "The filename of the Ripgrep executable. + +Is nil if no executable is found in your PATH during startup.") ;; @@ -52,7 +57,8 @@ debian, and derivatives). On most it's 'fd'.") projectile-kill-buffers-filter 'kill-only-files projectile-known-projects-file (concat doom-cache-dir "projectile.projects") projectile-ignored-projects '("~/") - projectile-ignored-project-function #'doom-project-ignored-p) + projectile-ignored-project-function #'doom-project-ignored-p + projectile-fd-executable doom-fd-executable) (global-set-key [remap evil-jump-to-tag] #'projectile-find-tag) (global-set-key [remap find-tag] #'projectile-find-tag) @@ -177,38 +183,47 @@ And if it's a function, evaluate it." (get 'projectile-git-submodule-command 'initial-value))) (funcall fn vcs)))) - ;; `projectile-generic-command' doesn't typically support a function, but my - ;; `doom--only-use-generic-command-a' advice allows this. I do it this way so - ;; that projectile can adapt to remote systems (over TRAMP), rather then look - ;; for fd/ripgrep on the remote system simply because it exists on the host. - ;; It's faster too. + ;; HACK: `projectile-generic-command' doesn't typically support a function, + ;; but my `doom--only-use-generic-command-a' advice allows this. I do it + ;; this way to make it easier for folks to undo the change (if not set to a + ;; function, projectile will revert to default behavior). (put 'projectile-git-submodule-command 'initial-value projectile-git-submodule-command) (setq projectile-git-submodule-command nil + ;; Include and follow symlinks in file listings. + projectile-git-fd-args (concat "-L -tl " projectile-git-fd-args " --ignore-file .project") projectile-indexing-method 'hybrid projectile-generic-command (lambda (_) - ;; If fd exists, use it for git and generic projects. fd is a rust - ;; program that is significantly faster than git ls-files or find, and - ;; it respects .gitignore. This is recommended in the projectile docs. + ;; If fd or ripgrep exists, use it to produce file listings for + ;; projectile commands. fd is a rust program that is significantly + ;; faster than git ls-files, find, or the various VCS commands + ;; projectile is configured to use. Plus, it respects .gitignore. (cond ((when-let* - ((bin (if (ignore-errors (file-remote-p default-directory nil t)) - (cl-find-if (doom-rpartial #'executable-find t) - (list "fdfind" "fd")) - doom-projectile-fd-binary)) + ((doom-fd-executable) + (projectile-git-use-fd) ;; REVIEW Temporary fix for #6618. Improve me later. - (version (with-memoization doom-projects--fd-version - (cadr (split-string (cdr (doom-call-process bin "--version")) + (version (with-memoization (get 'doom-fd-executable 'version) + (cadr (split-string (cdr (doom-call-process doom-fd-executable "--version")) " " t)))) ((ignore-errors (version-to-list version)))) - (concat (format "%s . -0 -H --color=never --type file --type symlink --follow --exclude .git %s" - bin (if (version< version "8.3.0") - "" "--strip-cwd-prefix")) - (if doom--system-windows-p " --path-separator=/")))) + (string-join + (delq + nil (list doom-fd-executable "." + (if (version< version "8.3.0") + (replace-regexp-in-string "--strip-cwd-prefix" "" projectile-git-fd-args t t) + projectile-git-fd-args) + (if doom--system-windows-p " --path-separator=/" ""))) + " "))) ;; Otherwise, resort to ripgrep, which is also faster than find - ((executable-find "rg" t) - (concat "rg -0 --files --follow --color=never --hidden -g!.git" - (if doom--system-windows-p " --path-separator=/"))) + (doom-ripgrep-executable + (string-join + (delq + nil (list doom-ripgrep-executable + "-0 --files --follow --color=never --hidden" + (if doom--system-windows-p " --path-separator=/"))) + " ")) + ((not doom--system-windows-p) "find . -type f | cut -c3- | tr '\\n' '\\0'") ("find . -type f -print0")))) (defadvice! doom--projectile-default-generic-command-a (fn &rest args) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 308e29708..6a013e65c 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -286,7 +286,7 @@ workable results ripgrep produces, despite the error." "Change `counsel-file-jump' to use fd or ripgrep, if they are available." :override #'counsel--find-return-list (cl-destructuring-bind (find-program . args) - (cond ((when-let (fd (executable-find (or doom-projectile-fd-binary "fd") t)) + (cond ((when-let (fd (executable-find (or doom-fd-executable "fd") t)) (append (list fd "--hidden" "--type" "file" "--type" "symlink" "--follow" "--color=never") (cl-loop for dir in projectile-globally-ignored-directories collect "--exclude" diff --git a/modules/completion/vertico/autoload/vertico.el b/modules/completion/vertico/autoload/vertico.el index 50059b68b..7689a18bb 100644 --- a/modules/completion/vertico/autoload/vertico.el +++ b/modules/completion/vertico/autoload/vertico.el @@ -211,15 +211,15 @@ targets." ;;;###autoload (defun +vertico/consult-fd-or-find (&optional dir initial) "Runs consult-fd if fd version > 8.6.0 exists, consult-find otherwise. -See URL `https://github.com/minad/consult/issues/770'." +See minad/consult#770." (interactive "P") ;; TODO this condition was adapted from a similar one in lisp/doom-projects.el, to be replaced with a more robust check post v3 (if (when-let* ((bin (if (ignore-errors (file-remote-p default-directory nil t)) (cl-find-if (doom-rpartial #'executable-find t) (list "fdfind" "fd")) - doom-projectile-fd-binary)) - (version (with-memoization doom-projects--fd-version + doom-fd-executable)) + (version (with-memoization (get 'doom-fd-executable 'version) (cadr (split-string (cdr (doom-call-process bin "--version")) " " t)))) ((ignore-errors (version-to-list version)))) diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index 3000fd2df..6e670476b 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -211,7 +211,7 @@ we have to clean it up ourselves." (use-package! fd-dired - :when doom-projectile-fd-binary + :when doom-fd-executable :defer t :init (global-set-key [remap find-dired] #'fd-dired)