From 29dd9a66053d0cccd805bab5c925a03be72f2d13 Mon Sep 17 00:00:00 2001 From: Bastien Date: Fri, 29 Dec 2017 18:36:27 +0100 Subject: [PATCH] org.el: New value for `org-todo-repeat-to-state' * lisp/org.el (org-todo-repeat-to-state): Allow `t' to use the previous TODO state. * doc/org.texi (Repeated tasks): Document the new optional value of `org-todo-repeat-to-state'. --- doc/org.texi | 18 +++++++++--------- lisp/org.el | 18 ++++++++++++------ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/doc/org.texi b/doc/org.texi index 6fc85794e..6aab1ba4e 100644 --- a/doc/org.texi +++ b/doc/org.texi @@ -6408,16 +6408,16 @@ Deadlines and scheduled items produce entries in the agenda when they are over-due, so it is important to be able to mark such an entry as completed once you have done so. When you mark a DEADLINE or a SCHEDULE with the TODO keyword DONE, it will no longer produce entries in the agenda. The problem -with this is, however, that then also the @emph{next} instance of the +with this is, however, is that then also the @emph{next} instance of the repeated entry will not be active. Org mode deals with this in the following -way: When you try to mark such an entry DONE (using @kbd{C-c C-t}), it will -shift the base date of the repeating timestamp by the repeater interval, and -immediately set the entry state back to TODO@footnote{In fact, the target -state is taken from, in this sequence, the @code{REPEAT_TO_STATE} property or -the variable @code{org-todo-repeat-to-state}. If neither of these is -specified, the target state defaults to the first state of the TODO state -sequence.}. In the example above, setting the state to DONE would actually -switch the date like this: +way: When you try to mark such an entry as DONE (using @kbd{C-c C-t}), it +will shift the base date of the repeating timestamp by the repeater interval, +and immediately set the entry state back to TODO@footnote{In fact, the target +state is taken from, in this sequence, the @code{REPEAT_TO_STATE} property, +the variable @code{org-todo-repeat-to-state} if it is a string, the previous +TODO state if @code{org-todo-repeat-to-state} is @code{t} or the first state +of the TODO state sequence.}. In the example above, setting the state to +DONE would actually switch the date like this: @example ** TODO Pay the rent diff --git a/lisp/org.el b/lisp/org.el index 44c42b26a..9975cd900 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -3026,13 +3026,17 @@ This option can also be set with on a per-file-basis with (defcustom org-todo-repeat-to-state nil "The TODO state to which a repeater should return the repeating task. -By default this is the first task in a TODO sequence, or the previous state -in a TODO_TYP set. But you can specify another task here. -alternatively, set the :REPEAT_TO_STATE: property of the entry." +By default this is the first task of a TODO sequence or the +previous state of a TYPE_TODO set. But you can specify to use +the previous state in a TODO sequence or a string. + +Alternatively, you can set the :REPEAT_TO_STATE: property of the +entry, which has precedence over this option." :group 'org-todo :version "24.1" - :type '(choice (const :tag "Head of sequence" nil) - (string :tag "Specific state"))) + :type '(choice (const :tag "Use the previous TODO state" t) + (const :tag "Use the head of the TODO sequence" nil) + (string :tag "Use a specific TODO state"))) (defcustom org-log-repeat 'time "Non-nil means record moving through the DONE state when triggering repeat. @@ -12782,7 +12786,9 @@ This function is run automatically after each state change to a DONE state." (when (and repeat (not (zerop (string-to-number (substring repeat 1))))) (when (eq org-log-repeat t) (setq org-log-repeat 'state)) (let ((to-state (or (org-entry-get nil "REPEAT_TO_STATE" 'selective) - org-todo-repeat-to-state))) + (and (stringp org-todo-repeat-to-state) + org-todo-repeat-to-state) + (and org-todo-repeat-to-state org-last-state)))) (org-todo (cond ((and to-state (member to-state org-todo-keywords-1)) to-state) -- 2.11.4.GIT