Re: [O] Function that splits a CLOCK interval
Hi Peter, Peter Frings on 2015-04-01 12:37: The following function now automates the task of splitting: … Fantastic, just what I needed! thanks for your feedback! I have now made a few improvements but not yet found time to get started with contributing the code to Worg, so one more email with the improvements. One little thing, though. When I interrupt the function with C-g at the prompt, the current line is already duplicated. It would by nice that C-g left the buffer unchanged. Done, see code below. Plus, the function now accepts a prefix argument and works with active time stamps. When a prefix argument is given, the interactive editing of the timestamp uses C as a default before changing A--C into A--B B--C. Cheers, Christoph --- % --- % --- % --- % --- % --- % --- % --- % --- % --- % --- (defun org-clock-split-current-interval (end-as-default) If this is a CLOCK line, split its clock time interval into two. Let the current time interval be A--C. By default, this function interactively prompts for a time B (suggesting A as a default), and then replaces A--C by B--C and A--B. When called with a prefix argument, the function uses C as a default for B. The point is left on the later interval, so that this line can, e.g., be moved to another entry. (interactive P) (save-excursion ;; Part of the following code is copied from org-clock-update-time-maybe. ;; If this function becomes part of org-clock.el, some refactoring would be in order. (beginning-of-line nil) (skip-chars-forward \t) (when (looking-at org-clock-string) (beginning-of-line nil) (let ((re (concat \\([ \t]* org-clock-string *\\) \\([[][^]]+[]]\\)\\(-+\\)\\([[][^]]+[]]\\) \\(?:[ \t]*=.*\\)?))) (when (looking-at re) (let ((indentation (match-string 1)) (start (match-string 2)) (to (match-string 3)) (end (match-string 4)) (use-start-as-default (equal end-as-default nil))) ;; interactively change A--C to B--C, ;; or (given prefix argument) to A--B, … (re-search-forward (concat org-clock-string \\([[]\\))) (when (not use-start-as-default) (re-search-forward \\([[]\\))) ;; … respecting whether A or C is an active or an inactive timestamp (call-interactively (if (equal (match-string 1) ) 'org-time-stamp 'org-time-stamp-inactive)) ;; If there were a function that implemented the actual body of org-clock-update-time-maybe, we could call that function, as in this context we _know_ that we are on a CLOCK line. (org-clock-update-time-maybe) ;; copy changed time B (re-search-backward org-ts-regexp-both) (let ((middle (match-string 0))) ;; insert A--B below, or (given prefix argument) insert B--C above (end-of-line (if use-start-as-default 1 0)) (insert \n indentation (if use-start-as-default start middle) to (if use-start-as-default middle end)) (org-clock-update-time-maybe -- Dr. Christoph Lange, Enterprise Information Systems Department Applied Computer Science @ University of Bonn; Fraunhofer IAIS http://langec.wordpress.com/about, Skype duke4701 → Semantic Publishing Challenge: Assessing the Quality of Scientific Output ESWC, 31 May–4 June 2014, Portorož, Slovenia. https://tinyurl.com/SPChallenge15 Submission deadline 27 March (abstracts: 20 March)
Re: [O] Function that splits a CLOCK interval
Christoph LANGE math.semantic@gmail.com writes: Hi Peter, Peter Frings on 2015-04-01 12:37: The following function now automates the task of splitting: … Fantastic, just what I needed! thanks for your feedback! I have now made a few improvements but not yet found time to get started with contributing the code to Worg, so one more email with the improvements. This is really useful for me too. Thank you. -- Xavier.
Re: [O] Function that splits a CLOCK interval
On 31 Mar 2015, at 18:59, Christoph LANGE math.semantic@gmail.com wrote: I use org's clocking facility to clock all my working time. I frequently find myself clocking time for a task T1, but later realize that I actually spent part of this time on some other task T2. [snip] The following function now automates the task of splitting: Fantastic, just what I needed! One little thing, though. When I interrupt the function with C-g at the prompt, the current line is already duplicated. It would by nice that C-g left the buffer unchanged. But other than that, this is a godsend for sloppy time-loggers like me. Cheers, Peter.
[O] Function that splits a CLOCK interval
Dear org-mode community, I use org's clocking facility to clock all my working time. I frequently find myself clocking time for a task T1, but later realise that I actually spent part of this time on some other task T2. In such a situation I go to the corresponding CLOCK: line for T1, split the interval clocked, e.g. from CLOCK: [2015-03-30 Mon 16:27]--[2015-03-30 Mon 16:30] = 0:03 to CLOCK: [2015-03-30 Mon 16:28]--[2015-03-30 Mon 16:30] = 0:02 CLOCK: [2015-03-30 Mon 16:27]--[2015-03-30 Mon 16:28] = 0:01 and move one of the two lines to the LOGBOOK of task T2. The following function now automates the task of splitting: --- % --- % --- % --- % --- % --- % --- % --- % --- % --- % --- (defun org-clock-split-current-interval () If this is a CLOCK line, split its clock time interval into two. t the current time interval be A--C; then this function interactively prompts for a time B (suggesting A as a default), and then replaces A--C by B--C and A--B. The point is left on the line B--C, so that this line can, e.g., be moved to another entry. (interactive) (save-excursion ;; Part of the following code is copied from org-clock-update-time-maybe. ;; If this function becomes part of org-clock.el, some refactoring would be in order. (beginning-of-line 1) (skip-chars-forward \t) (when (looking-at org-clock-string) (let ((re (concat [ \t]* org-clock-string *[[][^]]+[]]-+[[][^]]+[]] \\(?:[ \t]*=.*\\)?))) (when (looking-at re) ;; duplicate current line (resulting in A--C newline A--C) (let ((current-line (thing-at-point 'line t))) (when (or (= 1 (forward-line 1)) (eq (point) (point-max))) (insert \n)) (insert current-line)) ;; interactively change start time of the later interval ;; (resulting in B--C newline A--C) ;; TODO when universal-argument is provided, we might alternatively offer changing the end time of the earlier interval, resulting in A--C newline A--B. (forward-line -2) ;; we currently assume that all timestamps in clock intervals are inactive (search-forward (concat org-clock-string [)) ;; TODO call org-time-stamp with arguments that are conditional on whether an active or an inactive timestamp was found above (call-interactively 'org-time-stamp-inactive) ;; If there were a function that implemented the actual body of org-clock-update-time-maybe, we could call that function, as in this context we _know_ that we are on a CLOCK line. (org-clock-update-time-maybe) ;; copy changed time and also make it the end time of the earlier interval ;; (resulting in B--C newline A--B) (re-search-backward org-ts-regexp-both) (let ((ts (match-string 0))) (move-end-of-line 2) (when (re-search-backward org-ts-regexp-both nil t) (replace-match ts)) (org-clock-update-time-maybe))) (define-key org-mode-map (kbd \C-cs) 'org-clock-split-current-interval) --- % --- % --- % --- % --- % --- % --- % --- % --- % --- % --- As I said in my previous email: I would even be happy to contribute it to the codebase of org-mode (core or contrib); however in this case someone would have to point me to a fool-proof guide for how to do this. I know that for contributing code I will have to sign some FSF copyright forms, and I know how to use git, but I don't know the exact org-mode specific steps of doing so. Cheers, Christoph -- Dr. Christoph Lange, Enterprise Information Systems Department Applied Computer Science @ University of Bonn; Fraunhofer IAIS http://langec.wordpress.com/about, Skype duke4701 → Semantic Publishing Challenge: Assessing the Quality of Scientific Output ESWC, 31 May–4 June 2014, Portorož, Slovenia. https://tinyurl.com/SPChallenge15 Submission deadline 27 March (abstracts: 20 March)