branch: externals/denote
commit 947f0be070c686f2b253498d6eb65ac2abcaee8e
Author: Protesilaos Stavrou <i...@protesilaos.com>
Commit: Protesilaos Stavrou <i...@protesilaos.com>

    Prompt for directory among 'denote-directories' if needed
    
    The idea is to stop relying on the '(car (denote-directories))' pattern.
---
 denote.el | 50 +++++++++++++++++++++++++++++++++++---------------
 1 file changed, 35 insertions(+), 15 deletions(-)

diff --git a/denote.el b/denote.el
index 4e463425ed..db4ed20811 100644
--- a/denote.el
+++ b/denote.el
@@ -1039,12 +1039,32 @@ to override what this function returns."
 ;; prompt for one when one is absolutely necessary (is this ever the
 ;; case?) or fall back to the common root as in the function
 ;; `denote-directories-get-common-root'.
+
 (defun denote-directory ()
-  "Return the `car' of `denote-directories'.
-Unless this is definitely what you need, use the `denote-directories'
-instead.  Also see `denote-directories-get-common-root'."
+  "Return the `car` of `denote-directories`.
+DEPRECATED: This function is deprecated because it is misleading when
+multiple directories are configured.  Use `denote-directories` or
+`denote-directories-get-common-root` instead.
+
+Unless this is definitely what you need, use the `denote-directories`
+instead.  Also see `denote-directories-get-common-root`."
+  (display-warning 'denote "`denote-directory` is deprecated. Use 
`denote-directories` instead." :warning)
   (car (denote-directories)))
 
+(make-obsolete 'denote-directory 'denote-directories "4.1.0")
+
+(defvar denote-directories-maybe-prompt-history nil
+  "Minibuffer history for `denote-directories-maybe-prompt'.")
+
+(defun denote-directories-maybe-prompt ()
+  "Prompt for a directory among `denote-directories' if needed.
+If `denote-directories' has only one directory, return it outright."
+  (let ((directories (denote-directories)))
+    (if (denote-has-single-denote-directory-p)
+        (car directories)
+      (let ((default (car denote-directories-maybe-prompt-history)))
+        (completing-read "Select a directory: " directories nil t nil 
'denote-directories-maybe-prompt-history default)))))
+
 (defvar denote-generate-identifier-automatically t
   "Make creation and renaming commands automatically create and identifier.
 
@@ -1508,26 +1528,26 @@ With optional HAS-IDENTIFIER, only show candidates that 
have an
 identifier.
 
 Return the absolute path to the matching file."
-  (let* (;; Some external program may use `default-directory' with the
+  (let* ((single-dir-p (denote-has-single-denote-directory-p))
+         ;; Some external program may use `default-directory' with the
          ;; relative file paths of the completion candidates.
-         (default-directory (car (denote-directories)))
+         (default-directory (if single-dir-p
+                                (car (denote-directories))
+                              (denote-directories-get-common-root)))
          (files (denote-directory-files
                  (or denote-file-prompt-use-files-matching-regexp 
files-matching-regexp)
                  :omit-current nil nil has-identifier))
-         (relative-files (mapcar
-                          #'denote-get-file-name-relative-to-denote-directory
-                          files))
-         (prompt (if (denote-has-single-denote-directory-p)
+         (relative-files (if single-dir-p
+                             (mapcar 
#'denote-get-file-name-relative-to-denote-directory files)
+                           files))
+         (prompt (if single-dir-p
                      (format "%s in %s:"
                              (or prompt-text "Select FILE")
-                             (propertize (car (denote-directories)) 'face 
'denote-faces-prompt-current-name))
+                             (propertize default-directory 'face 
'denote-faces-prompt-current-name))
                    (format "%s: " (or prompt-text "Select FILE"))))
          (input (completing-read
                  prompt
-                 (denote--completion-table 'file
-                                           (if 
(denote-has-single-denote-directory-p)
-                                               relative-files
-                                             files))
+                 (denote--completion-table 'file relative-files)
                  nil (unless no-require-match :require-match)
                  nil 'denote-file-history))
          (absolute-file (if (denote-has-single-denote-directory-p)
@@ -3373,7 +3393,7 @@ instead of that of the parameter."
                            (t "")))
          (directory (if (and directory (denote--dir-in-denote-directory-p 
directory))
                         (file-name-as-directory directory)
-                      (car (denote-directories))))
+                      (denote-directories-maybe-prompt)))
          (template (if (or (stringp template) (functionp template))
                        template
                      (or (alist-get template denote-templates) "")))

Reply via email to