Re: [O] Function that splits a CLOCK interval

2015-04-07 Thread Christoph LANGE

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

2015-04-07 Thread Xavier Maillard

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

2015-04-01 Thread Peter Frings

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

2015-03-31 Thread Christoph LANGE

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)