]> git.eshelyaron.com Git - emacs.git/commitdiff
(project-forget-projects-under): Improve minibuffer action feedback main
authorEshel Yaron <me@eshelyaron.com>
Mon, 17 Feb 2025 08:24:56 +0000 (09:24 +0100)
committerEshel Yaron <me@eshelyaron.com>
Mon, 17 Feb 2025 08:24:56 +0000 (09:24 +0100)
lisp/progmodes/project.el

index b015387cfd792aef14b4251aa5eb5934626e3d5b..8656c20bf26cb59822ece76475a061320f9f254e 100644 (file)
@@ -1872,6 +1872,12 @@ With some possible metadata (to be decided).")
             (current-buffer)))
       (write-region nil nil filename nil 'silent))))
 
+(defvar project--roots-cache nil)
+
+(defsubst project--update-roots-cache ()
+  (setq project--roots-cache
+        (mapcar (compose #'expand-file-name #'car) project--list)))
+
 (defun project--remember-dir (root &optional no-write)
   "Add project root ROOT to the front of the project list.
 Save the result in `project-list-file' if the list of projects
@@ -1883,6 +1889,7 @@ has changed, and NO-WRITE is nil."
         (when (equal dir (car ent))
           (setq project--list (delq ent project--list))))
       (push (list dir) project--list)
+      (project--update-roots-cache)
       (unless no-write
         (project--write-project-list)))))
 
@@ -1902,6 +1909,7 @@ passed to `message' as its first argument."
   (project--ensure-read-project-list)
   (when-let ((ent (assoc (abbreviate-file-name project-root) project--list)))
     (setq project--list (delq ent project--list))
+    (project--update-roots-cache)
     (message report-message project-root)
     (project--write-project-list)))
 
@@ -2082,14 +2090,10 @@ Return the number of detected projects."
 (defun project-read-ancestor-directory (prompt)
   "Prompt with PROMPT for an ancestor directory of one or more project roots."
   (project--ensure-read-project-list)
+  (project--update-roots-cache)
   (read-directory-name
    prompt nil nil nil nil
-   (let ((ps (mapcar (lambda (p) (expand-file-name (car p))) project--list)))
-     (lambda (dir)
-       (catch 'ball
-         (dolist (p ps)
-           (when (string-prefix-p (expand-file-name dir) p)
-             (throw 'ball t))))))))
+   (lambda (dir) (try-completion (expand-file-name dir) project--roots-cache))))
 
 (defun project-forget-projects-under (dir &optional recursive)
   "Forget all known projects below a directory DIR.
@@ -2121,10 +2125,7 @@ Return the number of forgotten projects."
                count))
     count))
 
-(put 'project-forget-projects-under 'minibuffer-action
-     ;; TODO: Respect prefix arg.
-     ;; TODO: Update completion predicate for live feedback.
-     "forget")
+(put 'project-forget-projects-under 'minibuffer-action "forget")
 
 \f
 ;;; Project switching