From 388ae1c49d874e1580554ea3bdf7eb613fa506af Mon Sep 17 00:00:00 2001 From: Daneel Date: Mon, 23 Feb 2026 21:13:34 +0100 Subject: [PATCH] fix(org-noter): use relative NOTER_DOCUMENT path + start from org buffer context --- config.el | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/config.el b/config.el index b9f7520..d0af3a2 100644 --- a/config.el +++ b/config.el @@ -1249,13 +1249,17 @@ Otherwise: runs interactive ement-connect, then opens rooms after sync." org-noter-insert-note-no-questions nil org-noter-use-indirect-buffer nil)) -;; Smart org-noter launcher: works seamlessly from a PDF buffer. -;; Ensures the notes file exists with NOTER_DOCUMENT property before starting, -;; so org-noter never prompts "No document property found". +;; Smart org-noter launcher: always works from a PDF buffer. +;; Pre-creates the notes file with correct NOTER_DOCUMENT (relative path), +;; then starts org-noter from the notes file (org-mode context) to avoid +;; org-noter's file-search which requires parent-directory relationship. (defun my/org-noter-start () "Start org-noter for the PDF visible in the current frame. -Auto-creates or updates the notes file with the NOTER_DOCUMENT property." +Creates the notes file with a correct NOTER_DOCUMENT property (relative path) +if it does not already exist, then starts the session from the notes buffer." (interactive) + ;; Ensure org-noter is loaded so its variables are available + (require 'org-noter) (let* ((pdf-win (if (derived-mode-p 'pdf-view-mode) (selected-window) (cl-find-if @@ -1267,26 +1271,36 @@ Auto-creates or updates the notes file with the NOTER_DOCUMENT property." (with-current-buffer (window-buffer pdf-win) (buffer-file-name))))) (if (not pdf-path) - ;; No PDF open — fall back to standard org-noter + ;; No PDF buffer found — fall back to standard org-noter (org-noter) - ;; Build notes file path from PDF basename + notes search path - (let* ((base (file-name-base pdf-path)) - (notes-dir (car org-noter-notes-search-path)) - (notes-file (expand-file-name (concat base ".org") notes-dir))) + (let* ((base (file-name-base pdf-path)) + (notes-dir (expand-file-name "notes/" org-directory)) + (notes-file (expand-file-name (concat base ".org") notes-dir)) + ;; Relative path from notes file dir to PDF (what org-noter stores) + (rel-path (file-relative-name pdf-path notes-dir))) (make-directory notes-dir t) - ;; Ensure notes file has NOTER_DOCUMENT property + ;; Create or update notes file — insert NOTER_DOCUMENT as relative path (with-current-buffer (find-file-noselect notes-file) + (when (= (buffer-size) 0) + ;; New file: create a proper org-noter heading + (insert (format "* Notes: %s\n:PROPERTIES:\n:NOTER_DOCUMENT: %s\n:END:\n\n" + base rel-path)) + (save-buffer)) (unless (save-excursion (goto-char (point-min)) (re-search-forward ":NOTER_DOCUMENT:" nil t)) - ;; No NOTER_DOCUMENT found — insert a top-level heading with property + ;; Existing file without property: prepend heading (goto-char (point-min)) (insert (format "* Notes: %s\n:PROPERTIES:\n:NOTER_DOCUMENT: %s\n:END:\n\n" - base pdf-path)) + base rel-path)) (save-buffer))) - ;; Start org-noter from the PDF window - (with-selected-window pdf-win - (org-noter)))))) + ;; Open notes file and start org-noter from there (org-mode context) + ;; This uses the simpler code path that reads NOTER_DOCUMENT directly + (find-file notes-file) + (goto-char (point-min)) + (re-search-forward ":NOTER_DOCUMENT:" nil t) + (org-back-to-heading t) + (org-noter))))) (map! :leader (:prefix ("o" . "open")