(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
(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)))))
(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)))
(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.
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