Re: [O] Function that splits a CLOCK interval
Christoph LANGE 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
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
On 31 Mar 2015, at 18:59, Christoph LANGE 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)