Function: project-prompt-project-dir

project-prompt-project-dir is a byte-compiled function defined in project.el.gz.

Signature

(project-prompt-project-dir &optional PROMPT PREDICATE REQUIRE-KNOWN ALLOW-EMPTY)

Documentation

Prompt the user for a directory that is one of the known project roots.

The project is chosen among projects known from the project list, see project-list-file. If PROMPT is non-nil, use it as the prompt string. If PREDICATE is non-nil, filter possible project choices using this function; see project-prompter for more details. Unless REQUIRE-KNOWN is non-nil, it's also possible to enter an arbitrary directory not in the list of known projects. If ALLOW-EMPTY is non-nil, it is possible to exit with no input.

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/project.el.gz
(defun project-prompt-project-dir
    (&optional prompt predicate require-known allow-empty)
  "Prompt the user for a directory that is one of the known project roots.
The project is chosen among projects known from the project list,
see `project-list-file'.
If PROMPT is non-nil, use it as the prompt string.
If PREDICATE is non-nil, filter possible project choices using this
function; see `project-prompter' for more details.
Unless REQUIRE-KNOWN is non-nil, it's also possible to enter an
arbitrary directory not in the list of known projects.
If ALLOW-EMPTY is non-nil, it is possible to exit with no input."
  (project--ensure-read-project-list)
  (if-let* ((pred (alist-get 'prompt project-prune-zombie-projects))
            (inhibit-message t))
      (project--delete-zombie-projects pred))
  (let* ((dir-choice "... (choose a dir)")
         (choices
          ;; XXX: Just using this for the category (for the substring
          ;; completion style).
          (project--file-completion-table
           (if require-known project--list
             (append project--list `(,dir-choice)))))
         (project--dir-history (project-known-project-roots))
         pr-dir)
    (cl-loop
     do (setq pr-dir
            (let (history-add-new-input)
              (completing-read (if prompt
                                   ;; TODO: Use `format-prompt' (Emacs 28.1+)
                                   (format "%s: " (substitute-command-keys prompt))
                                 "Select project: ")
                               choices
                               (and predicate
                                    (lambda (choice)
                                      (or (equal choice dir-choice)
                                          (funcall predicate choice))))
                               t nil 'project--dir-history)))
     ;; If the user simply pressed RET, do this again until they don't.
     while (and (not allow-empty) (equal pr-dir "")))
    (if (equal pr-dir dir-choice)
        (read-directory-name "Select directory: " default-directory nil t)
      pr-dir)))