Add helper function to insert templates of periodic tasks

A periodic task is a task tagged with :PERIODIC:, and whose first child is an
item called "Template".  Following the template are the instances of the
periodic tasks, which constitute the actual things to do and which can be
scheduled independently of each other.  Whenever such an instance is due, the
template of the periodic task is supposed to be copied to the instance as a
first step.  This copying can be done manually, but of course doing it
automatically is easier.  The new function added in this commit represents a
first try to add such an automatism.
This commit is contained in:
Daniel - 2020-05-23 16:25:13 +02:00
parent 8cb39ec9e2
commit fba18ca527
No known key found for this signature in database
GPG Key ID: 1C7071A75BB72D64
2 changed files with 29 additions and 1 deletions

View File

@ -575,7 +575,8 @@
db/dired-from-shell-command
db/system-open
db/switch-to-dark-theme
db/switch-to-light-theme))
db/switch-to-light-theme
db/org-copy-template-for-periodic-task))
(use-package db-hydras
:commands (hydra-toggle/body

View File

@ -406,6 +406,33 @@ Work task and home task are determined by the current values of
org-home-task-id))
(org-clock-mark-default-task))))
(defun db/org-copy-template-for-periodic-task ()
"Copy template of the enclosing periodic task to item at point.
The template must be placed into an item titled 'Template',
called the template item. The template item must be the first
headline of the periodic task, i.e., of the parent of the current
item at point. The body of the template item, without any
drawers, will be copied to point."
(interactive)
(let ((template (save-mark-and-excursion
(let ((template-element (progn
(outline-up-heading 1 'invisible-ok)
(outline-next-heading)
(org-element-at-point))))
(unless (string-equal (org-element-property :title template-element)
"Template")
(assert "Template must be first headline in periodic task."))
;; XXX: trying to get the contents of the current item, without any
;; drawers, by going to the end of the template item and marking the
;; element at point, which, incidentally, seems to be the content we are
;; looking for; this feels hackish, there must be a better way to do it.
(goto-char (org-element-property :contents-end template-element))
(org-mark-element)
(buffer-substring-no-properties (region-beginning)
(region-end))))))
(insert template)
(org-update-statistics-cookies nil)))
;;; Calendar