From cedaae00e8ff28dacf04a538e5f8dcfa4eb87cf5 Mon Sep 17 00:00:00 2001 From: Daniel Borchmann Date: Mon, 13 Dec 2021 21:13:48 +0100 Subject: [PATCH] Make template copy function more robust Instead of going upward from the end, we now just start from the beginning and skip all drawers we may encounter. This should also allow to copy subtrees in templates, although adjustments to the headline indentations might be necessary if the template and point are on different levels. --- site-lisp/db-org.el | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/site-lisp/db-org.el b/site-lisp/db-org.el index 5415c93..6de110f 100644 --- a/site-lisp/db-org.el +++ b/site-lisp/db-org.el @@ -603,18 +603,23 @@ query for it." (save-mark-and-excursion (let ((template-element (org-with-point-at pom (org-element-at-point)))) - ;; Starting from the end of the last element in the subtree, - ;; we go up until we find a drawer or a headline; everything - ;; in between is considered to be the body. (let ((content-end (org-element-property :contents-end template-element)) - content-begin current-element) - (goto-char content-end) - (while (progn - (setq current-element (org-element-at-point)) - (not (memq (org-element-type current-element) - '(drawer property-drawer headline)))) - (setq content-begin (org-element-property :begin current-element)) - (goto-char (1- content-begin))) + current-element + content-begin) + ;; Start finding the beginning of the template contents from the top … + (goto-char (org-element-property :contents-begin template-element)) + ;; … but skip any drawers we may find. + (setq current-element (org-element-at-point)) + (while (memq (org-element-type current-element) + '(drawer property-drawer)) + (goto-char (org-element-property :end current-element)) + (setq current-element (org-element-at-point))) + ;; Now we are at the beginning of the contents, let's copy + ;; that, but only if it exists and is not empty. + (setq content-begin (org-element-property :begin current-element)) + (unless (and content-begin + (< content-begin content-end)) + (user-error "Cannot find content in template, or content is empty")) (string-trim-right (buffer-substring-no-properties content-begin content-end)))))))) (insert body)