From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christian Moe Subject: Re: org table calc and lisp for hh:mm timetable Date: Tue, 15 Mar 2011 22:47:56 +0100 Message-ID: <4D7FDE8C.1030103@christianmoe.com> References: <9999237C-1FBD-481E-AF8D-D68DB85080CE@gmail.com> <87lj0gqjd3.fsf@ucl.ac.uk> <0DDD90AF-9B9A-4FE3-8080-74EF01E6E292@gmail.com> Reply-To: mail@christianmoe.com Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from [140.186.70.92] (port=53779 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pzc3A-0000sn-CH for emacs-orgmode@gnu.org; Tue, 15 Mar 2011 17:45:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Pzc38-0002Cg-OG for emacs-orgmode@gnu.org; Tue, 15 Mar 2011 17:45:07 -0400 Received: from mars.hitrost.net ([91.185.211.18]:16453) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Pzc38-00027p-3g for emacs-orgmode@gnu.org; Tue, 15 Mar 2011 17:45:06 -0400 In-Reply-To: <0DDD90AF-9B9A-4FE3-8080-74EF01E6E292@gmail.com> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Martin Halder Cc: emacs-orgmode@gnu.org Hi, This is ingenious! But I have a different solution that borrows conversion functions from org-timer.el. To avoid an insanely long formula, I'll alias those functions with shorter names which don't seem to colide with anything in my Emacs. #+begin_src emacs-lisp (defun sec (arg) (org-timer-hms-to-secs arg)) (defun hms (arg) (org-timer-secs-to-hms arg)) #+end_src Now, just do this: | Start | Lunch | Back | End | Sum | |----------+----------+----------+----------+---------| | 08:00:00 | 12:20:00 | 13:00:00 | 17:00:00 | 8:20:00 | #+TBLFM: $5='(hms (+ (- (sec $4) (sec $3)) (- (sec $2) (sec $1)))) This already works for me, because my main interest here is in keeping track of my jogging, but those seconds are spurious precision for your use case, and take up space. So rewrite sec and hms: #+begin_src emacs-lisp (defun sec (arg) (if (string-match org-timer-re arg) (org-timer-hms-to-secs arg) (org-timer-hms-to-secs (concat arg ":00")))) (defun hms (arg) (if (integerp (/ arg 60)) (substring (org-timer-secs-to-hms arg) 0 -3) (org-timer-secs-to-hms arg))) #+end_src Now sec will correctly convert hh:mm stamps, too, and hms will convert to hh:mm format if the argument is in whole minutes, otherwise to hh:mm:ss. So: | Start | Lunch | Back | End | Sum | |-------+-------+-------+-------+------| | 08:00 | 12:20 | 13:00 | 17:00 | 8:20 | #+TBLFM: $5='(hms (+ (- (sec $4) (sec $3)) (- (sec $2) (sec $1)))) Yours, Christian On 3/15/11 8:49 PM, Martin Halder wrote: > >>> I was trying to generate a simple table with time format "hh:mm" and >>> auto calculate daily sum.. clocking working time was too much so I >>> thought this would be easy but ended up with the following.. it works >>> but is not beautiful (apply formula twice and same information >>> multiple times) and I would like to get rid of the "hms", "hh" and >>> "mm" columns and therefore call "hmconcat" directly somehow.. Any help >>> is highly appreciated.. >>> >>> Thanks, >>> Martin >>> >>> | Date | Start | Lunch | Back | End | Sum | hms | hh | mm | >>> |------------------+-------+-------+-------+-------+-------+-----------+----+----| >>> | [2011-03-01 Tue] | 08:00 | 12:20 | 13:00 | 17:00 | 08:20 | 8@ 20' 0" | 8 | 20 | >>> #+TBLFM: $6='(hmconcat $8 $9)::$7=time(<2010-01-01 $5>)-time(<2010-01-01 $4>)+time(<2010-01-01 $3>)-time(<2010-01-01 $2>)::$8=hour($7)::$9=minute($7) >>> >>> (defun hmconcat (hh mm) (interactive) >>> (if (> (length hh) 1) >>> (setq temp (concat hh ":")) (setq temp (concat "0" hh ":"))) >>> (if (> (length mm) 1) >>> (concat temp mm) (concat temp "0" mm))) >> >> Martin, >> >> glad to see you got further with this! >> >> You can definitely get rid of hmconcat by using a combination of >> string-to-number and format (and I'm sure it's possible to get this done >> with simpler elisp): >> >> --8<---------------cut here---------------start------------->8--- >> >> | Date | Start | Lunch | Back | End | Sum | hms | hh | mm | >> |------------------+-------+-------+-------+-------+-------+-----------+----+----| >> | [2011-03-01 Tue] | 08:00 | 12:20 | 13:00 | 17:00 | 08:20 | 8@ 20' 0" | 8 | 20 | >> #+TBLFM: $6='(format "%02d:%02d" (string-to-number $8) (string-to-number $9))::$7=time(<2010-01-01 $5>)-time(<2010-01-01 $4>)+time(<2010-01-01 $3>)-time(<2010-01-01 $2>)::$8=hour($7)::$9=minute($7) >> --8<---------------cut here---------------end--------------->8--- > > Hi Eric, > > yes and thanks for the previous help, too.. the good old printf.. I would like to pass the result of time() directly to a lisp function, like: > #+TBLFM: $6='(coolfunc (time(...$5)-time(...$4))) > > If I would know how to pass the result, eg as a string, to a lisp function I could sort it out, I guess. > > Thanks, > Martin >