فهرست منبع

Allow org-clock-in-switch-to-state to be a function.

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.
Carsten Dominik 16 سال پیش
والد
کامیت
f70127dd3f
2فایلهای تغییر یافته به همراه32 افزوده شده و 13 حذف شده
  1. 10 0
      lisp/ChangeLog
  2. 22 13
      lisp/org-clock.el

+ 10 - 0
lisp/ChangeLog

@@ -1,3 +1,13 @@
+2008-10-15  James TD Smith  <ahktenzero@mohorovi.cc>
+
+	* 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-16  Carsten Dominik  <dominik@science.uva.nl>
 
 	* org.el (org-add-log-setup): Respect

+ 22 - 13
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.