From mboxrd@z Thu Jan 1 00:00:00 1970 From: James TD Smith Subject: [PATCH 1/2] Allow org-clock-in-switch-to-state to be a function. Date: Thu, 16 Oct 2008 15:51:18 +0100 Message-ID: <1224168679-56353-1-git-send-email-ahktenzero@mohorovi.cc> Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KqUhn-00058I-07 for emacs-orgmode@gnu.org; Thu, 16 Oct 2008 11:24:03 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KqUhm-00057u-3J for emacs-orgmode@gnu.org; Thu, 16 Oct 2008 11:24:02 -0400 Received: from [199.232.76.173] (port=34071 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KqUhl-00057r-VW for emacs-orgmode@gnu.org; Thu, 16 Oct 2008 11:24:02 -0400 Received: from 81-86-40-42.dsl.pipex.com ([81.86.40.42]:54310 helo=masada.internal.mohorovi.cc) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KqUhl-00088Z-Ct for emacs-orgmode@gnu.org; Thu, 16 Oct 2008 11:24:01 -0400 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 Allow org-clock-in-switch-to-state to be a function. This lets you have different clocked in states for different TODO keyword sets, for example (defun ahkt-clock-state (state) (cond ((string= state "TOREAD") "READING") ((string= state "TOWATCH") "WATCHING") (t state))) Also fix indentation on clock lines, and empty clock drawers when they are inserted. --- lisp/ChangeLog | 14 ++++++++++++-- lisp/org-clock.el | 35 ++++++++++++++++++++++------------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 05e734c..0bca2be 100755 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,13 @@ +2008-10-15 James TD Smith + + * org-clock.el (org-clock-in-switch-to-state): Allow this to be a + function + (org-clock-in): If `org-clock-in-switch-to-state' is a function, + call it with the current todo state to get the state to switch to + when clocking in. + (org-clock-in): Use org-indent-line-function to indent clock lines. + (org-clock-find-position): Fix indentation of empty clock drawers. + 2008-10-14 Carsten Dominik * org-export-latex.el (org-export-latex-preprocess): Improve @@ -66,7 +76,7 @@ * org-clock.el (org-clock-heading-for-remember): New variable. (org-clock-in): Set `org-clock-heading-for-remember'. -2008-10-01 James TD Smith +2008-10-01 James TD Smith * org-remember.el (org-remember-apply-template): Add new expansions: %k, %K for currently clocked task and a link to the @@ -175,7 +185,7 @@ * org-export-latex.el (org-export-latex-keywords-maybe): Bug fix. -2008-09-22 James TA Smith +2008-09-22 James TD Smith * org-plot.el (org-plot/gnuplot): Make tables starting with a hline work correctly. diff --git a/lisp/org-clock.el b/lisp/org-clock.el index 4a14100..56894cc 100644 --- a/lisp/org-clock.el +++ b/lisp/org-clock.el @@ -67,12 +67,16 @@ A nil value means, clock will keep running until stopped explicitly with (defcustom org-clock-in-switch-to-state nil "Set task to a special todo state while clocking it. -The value should be the state to which the entry should be switched." +The value should be the state to which the entry should be +switched. If the value is a function, it must take one +parameter (the current TODO state of the item) and return the +state to switch it to." :group 'org-clock :group 'org-todo :type '(choice (const :tag "Don't force a state" nil) - (string :tag "State"))) + (string :tag "State") + (symbol :tag "Function"))) (defcustom org-clock-history-length 5 "Number of clock tasks to remember in history." @@ -265,12 +269,16 @@ the clocking selection, associated with the letter `d'." (org-back-to-heading t) (or interrupting (move-marker org-clock-interrupted-task nil)) (org-clock-history-push) - (when (and org-clock-in-switch-to-state - (not (looking-at (concat outline-regexp "[ \t]*" - org-clock-in-switch-to-state - "\\>")))) - (org-todo org-clock-in-switch-to-state)) - (setq org-clock-heading-for-remember + (cond ((functionp org-clock-in-switch-to-state) + (looking-at org-complex-heading-regexp) + (let ((newstate (funcall org-clock-in-switch-to-state (match-string 2)))) + (if newstate (org-todo newstate)))) + ((and org-clock-in-switch-to-state + (not (looking-at (concat outline-regexp "[ \t]*" + org-clock-in-switch-to-state + "\\>")))) + (org-todo org-clock-in-switch-to-state))) + (setq org-clock-heading-for-remember (and (looking-at org-complex-heading-regexp) (match-end 4) (org-trim (buffer-substring (match-end 1) (match-end 4))))) @@ -283,9 +291,9 @@ the clocking selection, associated with the letter `d'." (t "???"))) (setq org-clock-heading (org-propertize org-clock-heading 'face nil)) (org-clock-find-position) - + (insert "\n") (backward-char 1) - (indent-relative) + (org-indent-line-function) (insert org-clock-string " ") (setq org-clock-start-time (current-time)) (setq ts (org-insert-time-stamp (current-time) 'with-hm 'inactive)) @@ -348,11 +356,12 @@ the clocking selection, associated with the letter `d'." (or (bolp) (newline))) (when (eq t org-clock-into-drawer) (insert ":CLOCK:\n:END:\n") - (beginning-of-line -1) + (beginning-of-line 0) (org-indent-line-function) + (beginning-of-line 0) (org-flag-drawer t) - (beginning-of-line 2) - (org-indent-line-function))))) + (org-indent-line-function) + (beginning-of-line 2))))) (defun org-clock-out (&optional fail-quietly) "Stop the currently running clock. -- 1.6.0.2