Commit 3adf5a11a090

Vincent Demeester <vincent@sbr.pm>
2025-12-09 12:55:48
tools/emacs: trying to have a org-refile-to-denote function
When I want to refile to notes, allow me to select them or create one, and then refile into it. Signed-off-by: Vincent Demeester <vincent@sbr.pm>
1 parent 1ec6a55
Changed files (1)
tools
emacs
tools/emacs/init.el
@@ -1528,7 +1528,8 @@ Use this function via a hook."
 	 ("C-c n i" . denote-link-or-create)
 	 ("C-c n b" . denote-backlinks)
 	 ("C-c n F f" . denote-find-link)
-	 ("C-c n F b" . denote-find-backlink))
+	 ("C-c n F b" . denote-find-backlink)
+	 ("C-c n r" . vde/org-refile-to-denote))
   :custom
   (denote-directory org-notes-directory)
   (denote-rename-buffer-format "๐Ÿ“ %t")
@@ -1565,7 +1566,39 @@ Add this function to the `after-save-hook'."
      ((string-match "__journal.org$" (buffer-file-name))
       "journal")
      (t
-      (denote-sluggify (denote--retrieve-title-or-filename (buffer-file-name) 'org))))))
+      (denote-sluggify (denote--retrieve-title-or-filename (buffer-file-name) 'org)))))
+
+  (defun vde/org-refile-to-denote ()
+    "Refile to a denote note (existing or new)."
+    (interactive)
+    (let* ((source-buffer (current-buffer))
+	   (files (denote-directory-files))
+	   (choices (mapcar (lambda (f)
+			      (cons (denote-retrieve-title-value f 'org) f))
+			    files))
+	   (selection (completing-read "Refile to note: " (mapcar #'car choices)))
+	   (target (if-let ((match (cdr (assoc selection choices))))
+		       match
+		     (cl-letf (((symbol-function 'denote-title-prompt)
+                                (lambda (&rest _) selection)))
+		       (call-interactively #'denote))))
+	   (target-buffer (find-file-noselect target)))
+      (with-current-buffer target-buffer
+        (org-mode)
+        (save-excursion
+          (goto-char (point-min))
+          (unless (re-search-forward "^\\*+ " nil t)
+	    (goto-char (point-max))
+	    (insert "\n* Notes\n")))
+        (save-buffer))
+      (with-current-buffer source-buffer
+        (let ((org-refile-targets `((,target :maxlevel . 3)))
+	      (org-refile-use-outline-path 'file)
+              (org-refile-target-verify-function nil))
+          (org-refile-cache-clear)
+          ;; Force org to rebuild targets
+          (org-refile-get-targets)
+          (call-interactively #'org-refile))))))
 
 (use-package denote-org
   :after (denote org)