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'.
This commit is contained in:
Bastien 2017-12-29 18:36:27 +01:00
parent 8983ac917b
commit 29dd9a6605
2 changed files with 21 additions and 15 deletions

View File

@ -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

View File

@ -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)