diff --git a/org-roam-db.el b/org-roam-db.el index 3a9eec8..a3403ee 100644 --- a/org-roam-db.el +++ b/org-roam-db.el @@ -47,6 +47,7 @@ (defvar org-roam-verbose) (defvar org-agenda-files) +(declare-function org-roam-id-at-point "org-roam") (declare-function org-roam--org-roam-file-p "org-roam") (declare-function org-roam--list-all-files "org-roam") (declare-function org-roam-node-at-point "org-roam-node") @@ -235,6 +236,17 @@ If UPDATE-P is non-nil, first remove the file in the database." :values $v1] (list (vector file hash))))) +(defun org-roam-id-at-point () + "Return the ID at point, if any. +Recursively traverses up the headline tree to find the +first encapsulating ID." + (let (source) + (org-with-wide-buffer + (while (and (not (setq source (org-id-get))) + (not (bobp))) + (org-roam-up-heading-or-point-min))) + source)) + (defun org-roam-db-get-scheduled-time () "Return the scheduled time at point in ISO8601 format." (when-let ((time (org-get-scheduled-time (point)))) @@ -376,11 +388,7 @@ If UPDATE-P is non-nil, first remove the file in the database." (type (org-element-property :type link)) (dest (org-element-property :path link)) (properties (list :outline (org-get-outline-path))) - source) - (save-excursion - (while (and (not (setq source (org-id-get))) - (not (bobp))) - (org-up-heading-or-point-min))) + (source (org-roam-id-at-point))) (when source (org-roam-db-query [:insert :into links diff --git a/org-roam-node.el b/org-roam-node.el index 9e47262..0679fb5 100644 --- a/org-roam-node.el +++ b/org-roam-node.el @@ -37,6 +37,7 @@ (eval-when-compile (require 'org-roam-macs)) +(declare-function org-roam-id-at-point "org-roam") (defvar org-roam-mode-sections) ;;; Section @@ -117,12 +118,8 @@ nodes." If ASSERT, throw an error." (if-let ((node (magit-section-case (org-roam-node-section (oref it node)) - (t (let (id) - (org-with-wide-buffer - (while (and (not (setq id (org-id-get))) - (not (bobp))) - (org-up-heading-or-point-min)) - (org-roam-populate (org-roam-node-create :id id)))))))) + (t (when-let ((id (org-roam-id-at-point))) + (org-roam-populate (org-roam-node-create :id id))))))) node (when assert (user-error "No node at point")))) diff --git a/org-roam.el b/org-roam.el index e24a44c..d934759 100644 --- a/org-roam.el +++ b/org-roam.el @@ -161,6 +161,18 @@ This face is used on the region target by `org-roam-insertion' during an `org-roam-capture'." :group 'org-roam-faces) +;;;; ID Utilities +(defun org-roam-id-at-point () + "Return the ID at point, if any. +Recursively traverses up the headline tree to find the +first encapsulating ID." + (let (source) + (org-with-wide-buffer + (while (and (not (setq source (org-id-get))) + (not (bobp))) + (org-roam-up-heading-or-point-min))) + source)) + ;;;; File functions and predicates (defun org-roam--file-name-extension (filename) "Return file name extension for FILENAME.