branch: externals/denote
commit 49a2932d42a53812b6a5a69dd0daa87753a44dd2
Author: Protesilaos Stavrou <[email protected]>
Commit: Protesilaos Stavrou <[email protected]>
Implement denote-link-add-links
---
README.org | 38 ++++++++++++++++++++++++++++++++++++++
denote-link.el | 29 +++++++++++++++++++++++++++++
2 files changed, 67 insertions(+)
diff --git a/README.org b/README.org
index cf879c0e3a..054f5fb3aa 100644
--- a/README.org
+++ b/README.org
@@ -597,6 +597,44 @@ By default, the backlinks' buffer is displayed below the
current window.
The doc string of our user option includes a configuration that places
the buffer in a left side window instead.
+#+findex: denote-link-add-links
+The command ~denote-link-add-links~ adds links matching a regular
+expression or plain string. The links are added at point as a
+typographic list, such as:
+
+#+begin_example
+- link1
+- link2
+#+end_example
+
+The current note is excluded from the matching entries (adding a link to
+itself is pointless).
+
+Same examples of a regular expression that can be used with this
+command:
+
+- =journal= match all files which include =journal= anywhere in their
+ name.
+
+- =_journal= match all files which include =journal= as a keyword.
+
+- =^2022.*_journal= match all file names starting with =2022= and
+ including the keyword =journal=.
+
+If files are created with ~denote-sort-keywords~ as non-nil (the
+default), then it is easy to write a regexp that includes multiple
+keywords in alphabetic order:
+
+- =_denote.*_package= match all files that include both the =denote= and
+ =package= keywords, in this order.
+
+- =\(.*denote.*package.*\)\|\(.*package.*denote.*\)= is the same as
+ above, but out-of-order.
+
+Remember that in Emacs regexp input only needs to be quoted once when
+done interactively but twice when called from Lisp. What we show above
+is for interactive usage.
+
** TODO Finalise first version of denote-link.el [2/4]
*** DONE Add generic linking mechanism
*** DONE Flesh out the ~denote-link-backlinks~ prototype
diff --git a/denote-link.el b/denote-link.el
index 1c8e998b3d..c23c6c1fbc 100644
--- a/denote-link.el
+++ b/denote-link.el
@@ -256,5 +256,34 @@ default, it will show up below the current window."
(denote-link--prepare-backlinks id files title)
(user-error "No links to the current note"))))
+(defvar denote-link--links-to-files nil
+ "String of `denote-link-add-links-matching-keyword'.")
+
+(defun denote-link--prepare-links (files ext)
+ "Prepare links to FILES using format of EXT."
+ (setq denote-link--links-to-files
+ (with-temp-buffer
+ (mapc (lambda (f)
+ (insert (concat "- " (denote-link--format-link f ext)))
+ (newline))
+ files)
+ (let ((min (point-min))
+ (max (point-max)))
+ (buffer-substring-no-properties min max)))))
+
+;;;###autoload
+(defun denote-link-add-links (regexp)
+ "Insert links to all notes matching REGEXP.
+Use this command to reference multiple files at once.
+Particularly useful for the creation of metanotes (read the
+manual for more on the matter)."
+ (interactive
+ (list (read-regexp "Insert links matching REGEX: ")))
+ (let* ((default-directory (denote-directory))
+ (ext (denote-link--file-type-format (buffer-file-name))))
+ (if-let ((files (denote--directory-files-matching-regexp regexp)))
+ (insert (denote-link--prepare-links files ext))
+ (user-error "No links matching `%s'" regexp))))
+
(provide 'denote-link)
;;; denote-link.el ends here