branch: externals/denote commit 8c724d54cf44bfb29e3a150890547bc79215606d Author: Jean-Philippe Gagné Guay <jeanphilippe...@gmail.com> Commit: Protesilaos Stavrou <i...@protesilaos.com>
Support subdirectories - In denote-directory-files, replace directory-files with directory-files-recursively. - The new function denote--file-name-relative-to-denote-directory is used to fix the backlinks buffer and other parts of the code. - Adjust denote-link--expand-identifiers and denote-retrieve--read-file-prompt. --- denote-link.el | 18 +++++++++++------- denote-retrieve.el | 7 ++++--- denote.el | 24 +++++++++++++++++++----- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/denote-link.el b/denote-link.el index 66b886640e..8970bbbc3b 100644 --- a/denote-link.el +++ b/denote-link.el @@ -312,9 +312,13 @@ format is always [[denote:IDENTIFIER]]." (defun denote-link--expand-identifiers (regexp) "Expend identifiers matching REGEXP into file paths." - (delq nil (mapcar (lambda (i) - (file-name-completion i (denote-directory))) - (denote-link--collect-identifiers regexp)))) + (let ((files (denote--directory-files)) + (found-files)) + (dolist (file files) + (dolist (i (denote-link--collect-identifiers regexp)) + (if (string-prefix-p i (file-name-nondirectory file)) + (push file found-files)))) + found-files)) (defvar denote-link--find-file-history nil "History for `denote-link-find-file'.") @@ -442,16 +446,16 @@ Use optional TITLE for a prettier heading." (l (length heading))) (insert (format "%s\n%s\n\n" heading (make-string l ?-)))) (mapc (lambda (f) - (insert (file-name-nondirectory f)) + (insert f) (make-button (point-at-bol) (point-at-eol) :type 'denote-link-backlink-button) (newline)) files) - (goto-char (point-min)) + (goto-char (point-min))) ;; NOTE 2022-06-15: Technically this is not Dired. Maybe we ;; should abstract the fontification into a general purpose ;; minor-mode. - (when denote-link-fontify-backlinks - (denote-dired-mode 1))) + ;(when denote-link-fontify-backlinks + ;(denote-dired-mode 1))) (denote-link--display-buffer buf))) ;;;###autoload diff --git a/denote-retrieve.el b/denote-retrieve.el index c12907f872..a340d8fac0 100644 --- a/denote-retrieve.el +++ b/denote-retrieve.el @@ -90,7 +90,8 @@ Optional GROUP is a regexp construct for (defun denote-retrieve--read-file-prompt () "Prompt for regular file in variable `denote-directory'." - (read-file-name "Select note: " (denote-directory) nil nil nil #'denote--only-note-p)) + (read-file-name "Select note: " (denote-directory) nil nil nil + #'(lambda (f) (or (denote--only-note-p f) (file-directory-p f))))) (defun denote-retrieve--files-in-output (files) "Return list of FILES from `find' output." @@ -109,14 +110,14 @@ The xrefs are returned as an alist." Parse `denote-retrieve--xrefs'." (sort (mapcar (lambda (x) - (file-name-nondirectory (car x))) + (denote--file-name-relative-to-denote-directory (car x))) xrefs) #'string-lessp)) (defun denote-retrieve--proces-grep (identifier) "Process lines matching IDENTIFIER and return list of files." (let* ((default-directory (denote-directory)) - (file (file-name-nondirectory (buffer-file-name)))) + (file (denote--file-name-relative-to-denote-directory (buffer-file-name)))) (denote-retrieve--files-in-output (delete file (denote-retrieve--files-in-xrefs (denote-retrieve--xrefs identifier)))))) diff --git a/denote.el b/denote.el index 346986e12e..b785672a9a 100644 --- a/denote.el +++ b/denote.el @@ -310,6 +310,13 @@ FILE is relative to the variable `denote-directory'." (string-match-p (concat "\\b" denote--id-regexp) file) (not (string-match-p "[#~]\\'" file)))) +(defun denote--file-name-relative-to-denote-directory (file) + "Return file name of FILE relative to the variable `denote-directory'. +FILE must be an absolute path." + (if (and (file-name-absolute-p file) + (string-prefix-p (denote-directory) file)) + (substring-no-properties file (length (denote-directory))))) + (defun denote--current-file-is-note-p () "Return non-nil if current file likely is a Denote note." (and (or (string-match-p denote--id-regexp (buffer-file-name)) @@ -322,11 +329,18 @@ FILE is relative to the variable `denote-directory'." "List note files, assuming flat directory. If optional ABSOLUTE, show full paths, else only show base file names that are relative to the variable `denote-directory'." - (let ((default-directory (denote-directory))) - (seq-remove - (lambda (f) - (not (denote--only-note-p f))) - (directory-files default-directory absolute directory-files-no-dot-files-regexp t)))) + (let* ((default-directory (denote-directory)) + (files (mapcar + (lambda (s) (expand-file-name s)) + (seq-remove + (lambda (f) + (not (denote--only-note-p f))) + (directory-files-recursively default-directory directory-files-no-dot-files-regexp t))))) + (if absolute + files + (mapcar + (lambda (s) (denote--file-name-relative-to-denote-directory s)) + files)))) (defun denote--directory-files-matching-regexp (regexp &optional no-check-current) "Return list of files matching REGEXP.