From mboxrd@z Thu Jan 1 00:00:00 1970 From: Adam Elliott Subject: [PATCH] Auto resume clock-in fails Date: Thu, 09 Apr 2009 15:55:43 -0400 Message-ID: <49DE52BF.2010406@hgn.ca> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------020806020201060904070806" Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Ls0Lp-0001oY-1o for emacs-orgmode@gnu.org; Thu, 09 Apr 2009 15:55:53 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Ls0Lk-0001nw-Cr for emacs-orgmode@gnu.org; Thu, 09 Apr 2009 15:55:52 -0400 Received: from [199.232.76.173] (port=49640 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Ls0Lk-0001nt-4W for emacs-orgmode@gnu.org; Thu, 09 Apr 2009 15:55:48 -0400 Received: from cymlink-stage.hgn.ca ([64.26.151.4]:48851) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Ls0Lj-00065C-Fz for emacs-orgmode@gnu.org; Thu, 09 Apr 2009 15:55:47 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) by cymlink-stage.hgn.ca (Postfix) with ESMTP id C7E6E5F41C for ; Thu, 9 Apr 2009 15:55:42 -0400 (EDT) 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: emacs-orgmode@gnu.org This is a multi-part message in MIME format. --------------020806020201060904070806 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Using org 6.25e: Automatically resuming the clock after an Emacs restart fails under the following cases: 1. If org-log-states-order-reversed set to t (default), and a state change line precedes the clock line to resume. Error message is "Cannot restart clock because task does not contain unfinished clock". Example: *** STARTED test :LOGBOOK: - State "STARTED" from "TODO" [2009-04-09 Thu 13:50] CLOCK: [2009-04-09 Thu 13:50] :END: Reason: point is placed at start of state change line and so fails looking-at test (org-clock.el:345). Possible solution appears to be to use the existing function org-skip-over-state-notes when looking for the clock line to resume at org-clock.el:343. 2. If org-log-states-order-reversed set to nil. Error message is the same. Reason: point is placed *after* last clock line and so fails looking-at test. Possible solution: test order-reversed and back up one clock entry before looking-at test. I have combined these two ideas into a new function (patch attached). I don't imagine I've handled all of the possible configurations of state change entries, log entries, and clock lines, in and out of drawers, so this will probably serve more as a basis for a solution than a solution itself. (If nothing else, on org-clock.el:346 there's "\\t" where it should be "\t".) Adam --------------020806020201060904070806 Content-Type: text/plain; name="org-auto-clock-in.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="org-auto-clock-in.patch" --- /usr/local/src/org-6.25e/lisp/org-clock.el 2009-04-09 10:27:00.000000000 -0400 +++ org-clock.el 2009-04-09 15:52:12.437500000 -0400 @@ -280,7 +280,7 @@ (interactive "P") (catch 'abort (let ((interrupting (marker-buffer org-clock-marker)) - ts selected-task target-pos) + ts selected-task target-pos resume-clock) (when (equal select '(4)) (setq selected-task (org-clock-select-task "Clock-in on task: ")) (if selected-task @@ -342,16 +342,14 @@ (org-clock-find-position) (cond ((and org-clock-in-resume - (looking-at - (concat "^[ \\t]* " org-clock-string - " \\[\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\}" - " +\\sw+ +[012][0-9]:[0-5][0-9]\\)\\][ \t]*$"))) - (message "Matched %s" (match-string 1)) - (setq ts (concat "[" (match-string 1) "]")) - (goto-char (match-end 1)) + (setq resume-clock + (org-clock-find-last-clock-from-new-clock-position))) + (message "Matched %s" (car resume-clock)) + (setq ts (concat "[" (car resume-clock) "]")) + (goto-char (+ (length (car resume-clock)) (cdr resume-clock))) (setq org-clock-start-time (apply 'encode-time - (org-parse-time-string (match-string 1))))) + (org-parse-time-string (car resume-clock))))) ((eq org-clock-in-resume 'auto-restart) ;; called from org-clock-load during startup, ;; do not interrupt, but warn! @@ -455,6 +453,29 @@ (and (re-search-forward org-property-end-re nil t) (goto-char (match-beginning 0)))))))) +(defun org-clock-find-last-clock-from-new-clock-position () + "Attempts to locate last clock line, assuming point is at new +clock line position (see `org-clock-find-position'). If found, +moves point to beginning of last clock line and returns a cons +pair of the starting timestamp of the clock and the position of +the match; and otherwise restores point and returns nil." + (let ((saved-point (point)) heading-bound) + (save-match-data + (if org-log-states-order-reversed + (org-skip-over-state-notes) + (save-excursion + (org-back-to-heading t) + (beginning-of-line 2) + (setq heading-bound (point))) + (re-search-backward (concat "^[ \t]*" org-clock-string) heading-bound t)) + (if (looking-at + (concat "^[ \t]* " org-clock-string + " \\[\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\}" + " +\\sw+ +[012][0-9]:[0-5][0-9]\\)\\][ \t]*$")) + (cons (match-string 1) (match-beginning 1)) + (goto-char saved-point) + nil)))) + (defun org-clock-out (&optional fail-quietly) "Stop the currently running clock. If there is no running clock, throw an error, unless FAIL-QUIETLY is set." --------------020806020201060904070806 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Emacs-orgmode mailing list Remember: use `Reply All' to send replies to the list. Emacs-orgmode@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-orgmode --------------020806020201060904070806--