From 25a7051c12c0bade9693fe403f933b53b2bb6b78 Mon Sep 17 00:00:00 2001 From: Daniel Borchmann Date: Mon, 29 Nov 2021 17:05:21 +0100 Subject: [PATCH] Add function to update headline of Org mode item and log note This allows changing the headline of an item if it's scope changes and record this change in a note. --- site-lisp/db-org.el | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/site-lisp/db-org.el b/site-lisp/db-org.el index f6b6e04..9545c6d 100644 --- a/site-lisp/db-org.el +++ b/site-lisp/db-org.el @@ -620,6 +620,34 @@ query for it." (insert body) (org-update-statistics-cookies nil))) +(defun db/org-update-headline-log-note (new-headline) + "Replace headline of item at point with NEW-HEADLINE. +Interactively query for HEADLINE when not provided." + (interactive "sNew Headline: ") + + ;; We should check this before asking the user for the new headline, but how? + (unless (derived-mode-p 'org-mode) + (user-error "Not in an Org mode buffer, aborting")) + + (when (string-match-p "\n" new-headline) + (user-error "New headline contains newlines, aborting")) + + (when (org-before-first-heading-p) + (user-error "Point is before first headline, aborting")) + + (let ((old-headline (org-entry-get (point) "ITEM"))) + (org-edit-headline new-headline) + + ;; This simulates adding a note by manually. It may also work by directly + ;; using `org-add-note', but this function makes use of `post-command-hook' + ;; in a way I do not understand. So let's try it that way. + (move-marker org-log-note-marker (point)) + (let ((org-log-note-purpose 'note)) + (org-add-log-note nil) + (insert ; This goes into the *Org Note* buffer. + (format "Changed headline from: %s" old-headline)) + (org-store-log-note)))) + ;;; Calendar