From mboxrd@z Thu Jan 1 00:00:00 1970 From: Grant Schissler Subject: Re: Customize org-todo-repeat-to-state to return to previous TODO state Date: Mon, 24 Nov 2014 22:10:20 -0700 Message-ID: References: <87oas0z319.fsf@uw.edu> Mime-Version: 1.0 Content-Type: multipart/alternative; boundary=089e0102fc52afd7040508a7eeb5 Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:48476) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xt8Oi-0000cz-0J for emacs-orgmode@gnu.org; Tue, 25 Nov 2014 00:10:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xt8Og-0003zU-5R for emacs-orgmode@gnu.org; Tue, 25 Nov 2014 00:10:43 -0500 Received: from mail-wi0-x22f.google.com ([2a00:1450:400c:c05::22f]:57189) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xt8Of-0003wq-QP for emacs-orgmode@gnu.org; Tue, 25 Nov 2014 00:10:42 -0500 Received: by mail-wi0-f175.google.com with SMTP id l15so7889643wiw.14 for ; Mon, 24 Nov 2014 21:10:40 -0800 (PST) In-Reply-To: <87oas0z319.fsf@uw.edu> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org --089e0102fc52afd7040508a7eeb5 Content-Type: text/plain; charset=UTF-8 Great, thanks for all the excellent advice and code! I decided to approach this locally with a capture template and put my repeating APPT tasks under my Calendar headline. I created this capture template that does the job: (setq org-capture-templates '(("c" "Calendar" entry (file+headline "~/grantMain.org" "Calendar") "* APPT %?\n%i\n%a\n:PROPERTIES:\n:REPEAT_TO_STATE: APPT\n:END:\n" :prepend t))) Grant On Fri, Nov 21, 2014 at 1:56 PM, Brady Trainor wrote: > Grant Schissler writes: > > > Hi Org-mode Users, > > > > I am trying to change the behavior of marking a repeated task as DONE. I > > would like the task to return to the current TODO state rather than the > first in > > the TODO sequence or a fixed state. For example, > > > > ** APPT Lunch with Mallorie > > <2014-12-04 Thu 12:00 +1w> > > > > should return to APPT, not TODO or some other predefined state as in the > > current behavior: > > > > TODO Lunch with Mallorie > > - State "DONE" from "APPT" [2014-11-21 Fri 10:56] > > <2014-12-11 Thu 12:00 +1w> > > > > I am sure that customizing the org-todo-repeat-to-state will do the > trick, but > > sadly, I have had the time to learn elisp well enough to perform this. > > > > Any help would be much appreciated. Please let me know if you have > > questions. > > > > Thanks for the support and to all those that make org-mode great! > > Grant > > I haven't tried any of the following, and there may be better solutions, > but... > > It looks like the variable you mention reads as (via C-h v > org-todo-repeat-to-state RET and follow link to source), > > #+BEGIN_SRC emacs-lisp > (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." > :group 'org-todo > :version "24.1" > :type '(choice (const :tag "Head of sequence" nil) > (string :tag "Specific state"))) > > #+END_SRC > > It looks like this variable will not allow to recall the previous TODO > state. But you could make a separate TODO_TYP set. > > Depending on whether you define your TODO states in an init file or > per-file base, you could try an extra line in your org file "header", > > #+BEGIN_SRC org > ,#+TYP_TODO: APPT | DONE > #+END_SRC > > or an extra block in your org-todo-keywords variable > > #+BEGIN_SRC emacs-lisp > (setq org-todo-keywords '((type "APPT" "|" "DONE"))) > #+END_SRC > > Another solution according to the above would be to use a property drawer, > > #+BEGIN_SRC org > ,** APPT Lunch with Mallorie > <2014-12-04 Thu 12:00 +1w> > :PROPERTIES: > :REPEAT_TO_STATE: APPT > :END: > #+END_SRC > > You can get this via C-c C-x p repeat_to_state RET APPT RET. > > Interestingly, there is a function in the same source file, > org-auto-repeat-maybe, which suggests that it does exactly what you ask for. > > #+BEGIN_EXAMPLE > org-auto-repeat-maybe is a compiled Lisp function in `org.el'. > > (org-auto-repeat-maybe DONE-WORD) > > Check if the current headline contains a repeated deadline/schedule. > If yes, set TODO state back to what it was and change the base date > of repeating deadline/scheduled time stamps to new date. > This function is run automatically after each state change to a DONE state. > > [back] > #+END_EXAMPLE > > I can see in the definition of the function it has an expression > org-last-state, so maybe that suggests there is a way built-in (or intended > to?), but I only took that quick look at the source. > > -- > Brady > --089e0102fc52afd7040508a7eeb5 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Great, thanks for all the excellent advice and code!=C2=A0= I decided to approach this locally with a capture template and put my repe= ating APPT tasks under my Calendar headline.=C2=A0 I created this capture t= emplate that does the job:

(setq org-capture-templa= tes
=C2=A0 =C2=A0 =C2=A0 '(("c" "Calendar"= ; entry (file+headline "~/grantMain.org" "Calendar")
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"* APPT %?\n%i= \n%a\n:PROPERTIES:\n:REPEAT_TO_STATE: APPT\n:END:\n" :prepend t)))

Grant

On Fri, Nov 21, 2014 at 1:56 PM, Brady Trainor <algebr= at@uw.edu> wrote:
Grant Sc= hissler <grant.schissler@gm= ail.com> writes:

> Hi Org-mode Users,
>
> I am trying to change the behavior of marking a repeated task as DONE.= =C2=A0 I
> would like the task to return to the current TODO state rather than th= e first in
> the TODO sequence or a fixed state.=C2=A0 For example,
>
> ** APPT Lunch with Mallorie
> <2014-12-04 Thu 12:00 +1w>
>
> should return to APPT, not TODO or some other predefined state as in t= he
> current behavior:
>
> TODO Lunch with Mallorie
> - State "DONE"=C2=A0 =C2=A0 =C2=A0 =C2=A0from "APPT&quo= t;=C2=A0 =C2=A0 =C2=A0 =C2=A0[2014-11-21 Fri 10:56]
> <2014-12-11 Thu 12:00 +1w>
>
> I am sure that customizing the org-todo-repeat-to-state will do the tr= ick, but
> sadly, I have had the time to learn elisp well enough to perform this.=
>
> Any help would be much appreciated.=C2=A0 Please let me know if you ha= ve
> questions.
>
> Thanks for the support and to all those that make org-mode great!
> Grant

I haven't tried any of the following, and there may be better solutions= , but...

It looks like the variable you mention reads as (via C-h v org-todo-repeat-= to-state RET and follow link to source),

#+BEGIN_SRC emacs-lisp
(defcustom org-todo-repeat-to-state nil
=C2=A0 "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.=C2=A0 But you can specify another task here.
alternatively, set the :REPEAT_TO_STATE: property of the entry."
=C2=A0 :group 'org-todo
=C2=A0 :version "24.1"
=C2=A0 :type '(choice (const :tag "Head of sequence" nil)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(string :tag = "Specific state")))

#+END_SRC

It looks like this variable will not allow to recall the previous TODO stat= e. But you could make a separate TODO_TYP set.

Depending on whether you define your TODO states in an init file or per-fil= e base, you could try an extra line in your org file "header",
#+BEGIN_SRC org
,#+TYP_TODO: APPT | DONE
#+END_SRC

or an extra block in your org-todo-keywords variable

#+BEGIN_SRC emacs-lisp
(setq org-todo-keywords '((type "APPT" "|" "DO= NE")))
#+END_SRC

Another solution according to the above would be to use a property drawer,<= br>
#+BEGIN_SRC org
,** APPT Lunch with Mallorie
<2014-12-04 Thu 12:00 +1w>
:PROPERTIES:
:REPEAT_TO_STATE: APPT
:END:
#+END_SRC

You can get this via C-c C-x p repeat_to_state RET APPT RET.

Interestingly, there is a function in the same source file, org-auto-repeat= -maybe, which suggests that it does exactly what you ask for.

#+BEGIN_EXAMPLE
org-auto-repeat-maybe is a compiled Lisp function in `org.el'.

(org-auto-repeat-maybe DONE-WORD)

Check if the current headline contains a repeated deadline/schedule.
If yes, set TODO state back to what it was and change the base date
of repeating deadline/scheduled time stamps to new date.
This function is run automatically after each state change to a DONE state.=

[back]
#+END_EXAMPLE

I can see in the definition of the function it has an expression org-last-s= tate, so maybe that suggests there is a way built-in (or intended to?), but= I only took that quick look at the source.

--
Brady



--089e0102fc52afd7040508a7eeb5--