You probably want this: #+BEGIN_SRC emacs-lisp (defun my-redo () (interactive) (org-map-entries (lambda () (org-todo "TODO")) "TODO=\"DONE\"" ;; the match argument 'tree)) ;; the scope #+END_SRC Then call: M-x my-redo in the tree you want to reset. John ----------------------------------- Professor John Kitchin Doherty Hall A207F Department of Chemical Engineering Carnegie Mellon University Pittsburgh, PA 15213 412-268-7803 @johnkitchin http://kitchingroup.cheme.cmu.edu On Wed, Feb 28, 2018 at 4:36 PM, mediapathic steen wrote: > I have a subtree that contains a daily list of things to do (which I keep > as TODOs rather than checklist form for more granular time tracking). I > want to reset all of the DONE to TODO every day when I start it. Right now > I have this piece of code I copypasted from somewhere now lost (possibly > this very group): > > (org-map-entries (lambda () > (when > (string= > (nth 2 (org-heading-components)) "DONE") > (org-todo "TODO")))) > > This more or less makes sense to me. I have this code sitting in the > subtree, and in order to do my daily reset, I edit the subtree in an > indirect buffer, eval-region the code, then kill the buffer. > > What I would like to accomplish: > 1) Can you help me understand how to modify this code so that it only > applies to the subtree it's run in (parents also would be fine in this case > but not necessary and seems more of a challenge)? Doing the indirect buffer > thing seems more hassle than is reasonable. > > 2) I think I understand how to put this in my init in such a way that I > can C-x invoke it, rather than having to eval-region it, but I'm not > certain. Can you point me toward a reasonable tutorial or hints on how to > do that in general? > > Thanks in advance, > -- Steen >