From: Cody Goodman <codygman.consulting@gmail.com>
To: emacs-orgmode@gnu.org
Subject: Re: org-capture with :prepend t breaks :clock-resume functionality in 9.1.9
Date: Fri, 25 Oct 2019 19:01:22 -0500 [thread overview]
Message-ID: <CADq_+R2Wy1LVGRproDtFuQ9e-T7aY0foQFahMsR9XQ_3UbRT9Q@mail.gmail.com> (raw)
In-Reply-To: <CADq_+R2fTQyyY0UrKDR3nUfLj=NRxCBDoAtkJbu_JGPRrXXORw@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 6473 bytes --]
A little different solution that takes advantage of the fact that adding a
newline preserves the clock in the narrowed buffer. Maybe the right thing
to do is to widen/re-narrow buffer to include the clock within org-clock-in
though if it detects it's in an org capture buffer? Here is my working
solution for now with use-package and advice:
(use-package org
:straight org-plus-contrib
:init
(defun my/org-capture-place-entry ()
"Place the template as a new Org entry."
(let ((template (org-capture-get :template))
(reversed? (org-capture-get :prepend))
(exact-position (org-capture-get :exact-position))
(insert-here? (org-capture-get :insert-here))
(level 1))
(org-capture-verify-tree template)
(when exact-position (goto-char exact-position))
(cond
;; Force insertion at point.
((org-capture-get :insert-here) nil)
;; Insert as a child of the current entry.
((org-capture-get :target-entry-p)
(setq level (org-get-valid-level
(if (org-at-heading-p) (org-outline-level) 1)
1))
(if reversed? (outline-next-heading) (org-end-of-subtree t t)))
;; Insert as a top-level entry at the beginning of the file.
(reversed?
(goto-char (point-min))
(unless (org-at-heading-p) (outline-next-heading)))
;; Otherwise, insert as a top-level entry at the end of the file.
(t (goto-char (point-max))))
(let ((origin (point)))
(unless (bolp) (insert "\n"))
(org-capture-empty-lines-before)
(let ((beg (point)))
(save-restriction
(when insert-here? (narrow-to-region beg beg))
(org-paste-subtree level template 'for-yank))
(org-capture-position-for-last-stored beg)
(let ((end (point)))
(org-capture-empty-lines-after)
(unless (org-at-heading-p) (outline-next-heading))
(org-capture-mark-kill-region origin (point))
;; CHANGE: insert a newline so clock is included
(if (org-capture-get :clock-in) (insert "\n"))
(org-capture-narrow beg end)
(when (or (search-backward "%?" beg t)
(search-forward "%?" end t))
(replace-match "")))))))
(defun my/org-capture (&optional goto keys)
"Capture something.
\\<org-capture-mode-map>
This will let you select a template from `org-capture-templates', and
then file the newly captured information. The text is immediately
inserted at the target location, and an indirect buffer is shown where
you can edit it. Pressing `\\[org-capture-finalize]' brings you back to
the \
previous
state of Emacs, so that you can continue your work.
When called interactively with a `\\[universal-argument]' prefix argument
\
GOTO, don't
capture anything, just go to the file/headline where the selected
template stores its notes.
With a `\\[universal-argument] \\[universal-argument]' prefix argument,
go to \
the last note stored.
When called with a `C-0' (zero) prefix, insert a template at point.
When called with a `C-1' (one) prefix, force prompting for a date when
a datetree entry is made.
ELisp programs can set KEYS to a string associated with a template
in `org-capture-templates'. In this case, interactive selection
will be bypassed.
If `org-capture-use-agenda-date' is non-nil, capturing from the
agenda will use the date at point as the default date. Then, a
`C-1' prefix will tell the capture process to use the HH:MM time
of the day at point (if any) or the current HH:MM time."
(interactive "P")
(when (and org-capture-use-agenda-date
(eq major-mode 'org-agenda-mode))
(setq org-overriding-default-time
(org-get-cursor-date (equal goto 1))))
(cond
((equal goto '(4)) (org-capture-goto-target))
((equal goto '(16)) (org-capture-goto-last-stored))
(t
(let* ((orig-buf (current-buffer))
(annotation (if (and (boundp 'org-capture-link-is-already-stored)
org-capture-link-is-already-stored)
(plist-get org-store-link-plist :annotation)
(ignore-errors (org-store-link nil))))
(entry (or org-capture-entry (org-capture-select-template keys)))
initial)
(setq initial (or org-capture-initial
(and (org-region-active-p)
(buffer-substring (point) (mark)))))
(when (stringp initial)
(remove-text-properties 0 (length initial) '(read-only t) initial))
(when (stringp annotation)
(remove-text-properties 0 (length annotation)
'(read-only t) annotation))
(cond
((equal entry "C")
(customize-variable 'org-capture-templates))
((equal entry "q")
(user-error "Abort"))
(t
(org-capture-set-plist entry)
(org-capture-get-template)
(org-capture-put :original-buffer orig-buf
:original-file (or (buffer-file-name orig-buf)
(and (featurep 'dired)
(car (rassq orig-buf
dired-buffers))))
:original-file-nondirectory
(and (buffer-file-name orig-buf)
(file-name-nondirectory
(buffer-file-name orig-buf)))
:annotation annotation
:initial initial
:return-to-wconf (current-window-configuration)
:default-time (or org-overriding-default-time
(org-current-time)))
(org-capture-set-target-location (and (equal goto 0) 'here))
(condition-case error
(org-capture-put :template (org-capture-fill-template))
((error quit)
(if (get-buffer "*Capture*") (kill-buffer "*Capture*"))
(error "Capture abort: %s" (error-message-string error))))
(setq org-capture-clock-keep (org-capture-get :clock-keep))
(condition-case error
(org-capture-place-template
(eq (car (org-capture-get :target)) 'function))
((error quit)
(when (and (buffer-base-buffer (current-buffer))
(string-prefix-p "CAPTURE-" (buffer-name)))
(kill-buffer (current-buffer)))
(set-window-configuration (org-capture-get :return-to-wconf))
(error "Capture template `%s': %s"
(org-capture-get :key)
(error-message-string error))))
(when (and (derived-mode-p 'org-mode) (org-capture-get :clock-in))
(condition-case nil
(progn
(when (org-clock-is-active)
(org-capture-put :interrupted-clock
(copy-marker org-clock-marker)))
(org-clock-in)
;; CHANGE: remove inserted newline now that clock is in narrowed buffer
(save-excursion (if (org-capture-get :clock-in)
(progn (goto-char (point-max)) (join-line))))
(setq-local org-capture-clock-was-started t))
(error "Could not start the clock in this capture buffer")))
(when (org-capture-get :immediate-finish)
(org-capture-finalize))))))))
(advice-add 'org-capture-place-entry :override
#'my/org-capture-place-entry)
(advice-add 'org-capture :override #'my/org-capture)
)
[-- Attachment #2: Type: text/html, Size: 7956 bytes --]
next prev parent reply other threads:[~2019-10-26 0:01 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-25 17:35 org-capture with :prepend t breaks :clock-resume functionality in 9.1.9 Cody Goodman
2019-10-26 0:01 ` Cody Goodman [this message]
2020-02-12 16:45 ` Bastien
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CADq_+R2Wy1LVGRproDtFuQ9e-T7aY0foQFahMsR9XQ_3UbRT9Q@mail.gmail.com \
--to=codygman.consulting@gmail.com \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).