diff options
Diffstat (limited to 'bard-elisp/bard-writing.el')
| -rw-r--r-- | bard-elisp/bard-writing.el | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/bard-elisp/bard-writing.el b/bard-elisp/bard-writing.el index e1e4048..0f18c46 100644 --- a/bard-elisp/bard-writing.el +++ b/bard-elisp/bard-writing.el @@ -1,5 +1,8 @@ (require 'consult) (require 'beframe) +(require 'calendar) +(require 'org-roam-node) +(require 'denote) (defvar bard/consult--source-notes `(:name "Note Buffers" @@ -64,6 +67,46 @@ (expand-file-name file))) (bard/denote-insert-id-at-top)))) +(defun bard/insert-or-create-node () + "Insert an Org-roam link if the note exists; otherwise create via Denote." + (interactive) + ;; Prompt for an existing node, but do not auto-create + (let* ((node (org-roam-node-read)) + (title (org-roam-node-title node))) + (if node + ;; Node exists: insert Org-roam link at point + (let ((id (org-roam-node-id node))) + (if id + (insert (org-link-make-string + (concat "id:" id) + title)) + ;; Node does not exist (no id): create via Denote + (bard/denote-insert-node title)))))) + +(defun bard/denote-insert-node (title) + "Denote analogy for `org-roam-insert-node', takes TITLE as node title." + (interactive) + (let* ((keywords (denote-keywords-prompt)) + (file (denote title keywords nil nil nil nil nil nil))) + + (when-let ((buf (find-buffer-visiting file))) + (with-current-buffer buf + (save-buffer) + (kill-buffer buf))) + + ;; extract uuid from file that is autogenerated by `bard/denote-insert-id-at-top' + (let ((uuid + (with-temp-buffer + (insert-file-contents file) + (goto-char (point-min)) + (when (re-search-forward "^:ID:\\s-+\\([[:alnum:]-]+\\)" nil t) + (match-string 1))))) + (unless uuid + (error "No :ID: found in Denote file %s" file)) + + ;; Insert link at point + (insert (format "[[id:%s][%s]]" uuid title))))) + (defun denote-sequence-region () "Call `denote-sequence' and insert therein the text of the active region. |
