summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Drake <dan.drake@gmail.com>2020-02-13 07:48:04 +0100
committerBastien <bzg@gnu.org>2020-02-13 07:48:04 +0100
commit554a3fc64327cc35d85c1885804b295a64fb75a1 (patch)
treefa7ba1f6d1029d27420bbb153f427dc09c577bd1
parent32a5fa0b6c61c1cb6d24decb63b381f3bf75de34 (diff)
downloadorg-mode-554a3fc64327cc35d85c1885804b295a64fb75a1.tar.gz
org-clock.el: Add `t' option to `org-clock-resolve'
* org-clock.el (org-clock-resolve): add `t' option. This works like `k', but asks the user to specify a time instead of a number of minutes. TINYCHANGE Often when you are interrupted at a task and get back to it, you know what time the interruption happened. This option makes it easy to tell org-resolve-clocks about that. For example, say you clocked into task A at, say, 9:37: * original task A :LOGBOOK: CLOCK: [2020-01-21 Mon 09:37] :END: While working on task A, you get a phone call. When the call is done, you'd like to update your time logging to reflect the phone call. Your phone says the call was at 11:09. With C-c C-x C-z, you can use the `K' option, but you need to figure out the number of minutes to keep. It's easier to look at the phone, or to mentally note the time when an interruption starts. With the new option, you can select `T', and just specify a time of 11:09. The state is now: * original task A :LOGBOOK: CLOCK: [2020-01-21 Mon 09:37]--[2020-01-21 Mon 11:09] => 1:32 :END: You add the phone call to your org buffer and do C-c C-x C-i to clock in. Org asks you to start the time from when the previous task ended, you say yes, and the state is now: * original task A :LOGBOOK: CLOCK: [2020-01-21 Mon 09:37]--[2020-01-21 Mon 11:09] => 1:32 :END: * task B, phone call :LOGBOOK: CLOCK: [2020-01-21 Mon 11:09] :END: At this point, you can clock back into task A, or any other task. The key feature here is to be able to just type in a time -- in any format accepted by org-read-date -- instead of specifying a number of minutes.
-rw-r--r--etc/ORG-NEWS6
-rw-r--r--lisp/org-clock.el22
2 files changed, 22 insertions, 6 deletions
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index bf2ca1a..15f3698 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -104,6 +104,12 @@ data lines, such as planning/clock lines and property/logbook drawers.
Also, with this setting, =org-indent-mode= will keep these data lines
correctly aligned with the headline above.
+*** New option to resolve open clock at a provided time
+
+~org-resolve-clocks~ now has a `t' option, which works just like the
+`k' option, but the user specifies a time of day, not a number of
+minutes.
+
*** Babel: new header argument to pass Java command line arguments
Babel Java blocks recognize header argument =:cmdargs= and pass its
diff --git a/lisp/org-clock.el b/lisp/org-clock.el
index aee6ead..db89247 100644
--- a/lisp/org-clock.el
+++ b/lisp/org-clock.el
@@ -1021,6 +1021,11 @@ CLOCK is a cons cell of the form (MARKER START-TIME)."
(org-flag-drawer nil element))
(throw 'exit nil)))))))))))
+(defun org-clock-time-to-mins-to-keep (start-time)
+ "Ask the user for a time and return the number of minutes from START-TIME to that time."
+ (floor (/ (float-time
+ (time-subtract (org-read-date t t) start-time)) 60)))
+
(defun org-clock-resolve (clock &optional prompt-fn last-valid fail-quietly)
"Resolve an open Org clock.
An open clock was found, with `dangling' possibly being non-nil.
@@ -1057,6 +1062,9 @@ k/K Keep X minutes of the idle time (default is all). If this
that many minutes after the time that idling began, and then
clocked back in at the present time.
+t/T Like `k', but will ask you to specify a time, instead of a
+ number of minutes.
+
g/G Indicate that you \"got back\" X minutes ago. This is quite
different from `k': it clocks you out from the beginning of
the idle period and clock you back in X minutes ago.
@@ -1076,19 +1084,21 @@ to be CLOCKED OUT."))))
(while (or (null char-pressed)
(and (not (memq char-pressed
'(?k ?K ?g ?G ?s ?S ?C
- ?j ?J ?i ?q)))
+ ?j ?J ?i ?q ?t ?T)))
(or (ding) t)))
(setq char-pressed
(read-char (concat (funcall prompt-fn clock)
- " [jkKgGSscCiq]? ")
+ " [jkKtTgGSscCiq]? ")
nil 45)))
(and (not (memq char-pressed '(?i ?q))) char-pressed)))))
(default
(floor (org-time-convert-to-integer (org-time-since last-valid))
60))
(keep
- (and (memq ch '(?k ?K))
- (read-number "Keep how many minutes? " default)))
+ (or (and (memq ch '(?k ?K))
+ (read-number "Keep how many minutes? " default))
+ (and (memq ch '(?t ?T))
+ (org-clock-time-to-mins-to-keep last-valid))))
(gotback
(and (memq ch '(?g ?G))
(read-number "Got back how many minutes ago? " default)))
@@ -1103,7 +1113,7 @@ to be CLOCKED OUT."))))
(org-clock-resolve-clock clock 'now nil t nil fail-quietly))
(org-clock-jump-to-current-clock clock))
((or (null ch)
- (not (memq ch '(?k ?K ?g ?G ?s ?S ?C))))
+ (not (memq ch '(?k ?K ?g ?G ?s ?S ?C ?t ?T))))
(message ""))
(t
(org-clock-resolve-clock
@@ -1127,7 +1137,7 @@ to be CLOCKED OUT."))))
(t
(error "Unexpected, please report this as a bug")))
(and gotback last-valid)
- (memq ch '(?K ?G ?S))
+ (memq ch '(?K ?G ?S ?T))
(and start-over
(not (memq ch '(?K ?G ?S ?C))))
fail-quietly)))))