emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Ross Patterson <me@rpatterson.net>
To: emacs-orgmode@gnu.org
Subject: Re: org-agenda-list-stuck-projects and nested projects
Date: Thu, 10 Jul 2008 16:29:56 -0700	[thread overview]
Message-ID: <87iqvdco7f.fsf@transitory.lefae.org> (raw)
In-Reply-To: 87fxqknu8i.fsf@transitory.lefae.org

Ross Patterson <me@rpatterson.net> writes:

> Carsten Dominik <dominik@uva.nl> writes:
>
>> The "stuck projects" view depends on the hypothesis that you can
>> clearly identify what a "project means".  In the default setup, projects
>> are assumed to have LEVEL=2 and should not be DONE.
>>
>> In the hierarchy you are using, it seems that any entry can be called a
>> "projects",  and that you do have projects within projects.  So the
>> idea that
>> you need to avoid skipping subtrees and limit yourself to skipping
>> entries only
>> is the right approach.
>>
>> However, what you are really asking for is to look only at direct
>> children,
>> and in this case is is better to write a special skip function:
>>
>> (defun org-skip-unless-child-todo ()
>>   (let ((subtree-end (save-excursion (org-end-of-subtree t)))
>> 	(entry-end (save-excursion (or (outline-next-heading) (point-max)))))
>>     (if (re-search-forward
>> 	 (concat "^" (regexp-quote
>> 		      (make-string (1+ level) ?*))
>> 		 "[ \t]+"
>> 		 "\\("
>> 		 (mapconcat 'identity org-not-done-keywords "\\|")
>> 		 "\\)")
>> 	 subtree-end t)
>> 	;; skip this entry by returning the entry-end position
>> 	entry-end
>>       ;; do not skip this entry by returning nil
>>       nil)))
>>
>> As you can see, this function first determines the end of the subtree
>> (for the search) and the end of the entry positions.  Then it creates
>> a special regular expression that will only match headlines that are
>> direct children of the current level.  During a tags search, the
>> "level" variable contains the current level (careful, when you are
>> using org-odd-levels-only, it contains the reduced level...).
>> So the special regexp contains one star more that the current, and then
>> any TODO keyword.
>>
>> If there is a TODO child, the function returns the position at the end
>> of
>> entry, to continue search from there.
>>
>> If there is no mach, it returns nil, meaning that this entry should
>> *not* be skipped.
>>
>> The agenda custom command would look like this:
>>
>> (("0" "Special Stuck" tags "LEVEL>0/-DONE-TODO"
>>   ((org-agenda-skip-function 'org-skip-unless-child-todo)))
>>
>> So we select entries that are LEVEL>0, i.e. all entries, but we require
>> that these entries are not TODO entries.  OK, these are the candidate
>> projects.  And the we skip them when they have a direct TODO child.
>>
>> HTH
>>
>> - Carsten
>
> Wow, that is a response and a half!  Looks like you've pretty much done
> it for me.  Thanks so much!  I'll let you know how it works.

Thanks again for that function and custom command.  They work like a
charm!

Having gotten to use them for a bit, I wonder if one refinement would be
possible.  Consider the following tree:

    * Testing
    ** Project
    *** Sub-project
    **** TODO Task

With the custom command you provided, the "* Project" entry will be
reported as a stuck project.  Ideally, I'd like it not to be considered
a stuck project.

I'm not familiar with how the agenda "skipping" works so I don't know if
this is possible, but I'd like a heading to be skipped if all it's
immediate children are either active TODO's or are skipped themselves.
It's a recursive definition.  Is that possible?

Ross

>> On Jul 7, 2008, at 3:21 PM, Ross Patterson wrote:
>>
>>> One of the things I love about org-mode is that it's generally
>>> hierarchy
>>> agnostic which is to say it doesn't care what level or depth entries
>>> are
>>> with regards to the functionality org-mode provides with entries
>>> (TODOs,
>>> Dates and times, tags, etc.).
>>>
>>> Many of the projects I'd like to manage with org-mode are fairly large
>>> and as such I'd like to make use of org-mode's heirarchical
>>> agnosticism
>>> to factor my projects into nested projects arbitrary depth.  This is
>>> supported very well by the rest of org-mode, just not the stuck
>>> projects
>>> agenda view.
>>>
>>> I find that view very valuable, but if I have a project with lots of
>>> branches that can move in parallel and one of those branches is stuck
>>> but another isn't stuck, then the stuck projects report doesn't
>>> reflect
>>> this assuming that if one branch isn't stuck then the project isn't
>>> stuck.  Since the project is very large, that means I have to inspect
>>> the whole tree to figure out what might be stuck.  The only workaround
>>> with the current implementation is that anytime I have a
>>> project/sub-project/branch lower than LEVEL=2 that I need to be able
>>> to
>>> review, then I have to break it out to a LEVEL=2 headline.  This
>>> creates
>>> a negative feedback which will probably result in me not using the
>>> stuck
>>> projects view and probably insufficiently reviewing my projects.
>>>
>>> What I'd like is an agenda view like the stuck projects view but
>>> rather
>>> than omitting any project that has any active TODO's all the way up
>>> the
>>> hierarchy, it will only omit headlines that have active TODO's among
>>> its
>>> immediate children.
>>>
>>> If I start with a test.org file like so:
>>>
>>>    * Testing
>>>    ** Stuck Project at Level 2
>>>    *** Sub-project at Level 3
>>>    **** DONE bar
>>>    *** Sub-project 2 at Level 3
>>>
>>> And customize org-stuck-projects to remove the LEVEL=2 restriction
>>> like
>>> so:
>>>
>>>    (setq org-stuck-projects '("/-DONE" ("TODO") nil ""))
>>>
>>> And finally customize the org-tags-match-list-sublevels to allow tags
>>> matching to descend.
>>>
>>> Then if I open test.org and do "C-c a < #" I get:
>>>
>>>    List of stuck projects:
>>>      test:       .Stuck Project at Level 2
>>>      test:       ..Sub-project at Level 3
>>>      test:       ..Sub-project 2 at Level 3
>>>
>>> Then if I re-activate the bar heading by putting it in the TODO state:
>>>
>>>    * Testing
>>>    ** Stuck Project at Level 2
>>>    *** Sub-project at Level 3
>>>    **** TODO bar
>>>    *** Sub-project 2 at Level 3
>>>
>>> I get an empty list:
>>>
>>>    List of stuck projects:
>>>
>>> I'd like a list with the sub-heading that is still stuck:
>>>
>>>    List of stuck projects:
>>>      test:       .Stuck Project at Level 2
>>>      test:       ..Sub-project 2 at Level 3
>>>
>>> I tried modifying the org-agenda-list-stuck-projects function by
>>> implementing an org-agenda-skip-function that only skips the heading
>>> and not the whole subtree:
>>>
>>>    (defun org-agenda-skip-entry-when-regexp-matches ()
>>>      "Checks if the current entry contains match for `org-agenda-
>>> skip-regexp'.
>>>    If yes, it returns the end position of this entry, causing agenda
>>>    commands to skip this entry.  This is a function that can be put
>>>    into `org-agenda-skip-function' for the duration of a command."
>>>      (org-agenda-skip-if nil '(regexp org-agenda-skip-regexp)))
>>>
>>> Then I replaced the org-agenda-skip-function set in
>>> org-agenda-list-stuck-projects by replacing:
>>>
>>>  (let* ((org-agenda-skip-function 'org-agenda-skip-subtree-when-
>>> regexp-matches)
>>>
>>> with:
>>>
>>>  (let* ((org-agenda-skip-function
>>> org-agenda-skip-entry-when-regexp-
>>> matches)
>>>
>>> But that gets me:
>>>
>>>    List of stuck projects:
>>>      test:       .Stuck Project at Level 2
>>>      test:       ..Sub-project at Level 3
>>>      test:       ...TODO bar
>>>      test:       ..Sub-project 2 at Level 3
>>>
>>> I'm new to the internals of org-mode.  Can anyone help me figure out
>>> what's wrong with my attempted solution here?
>>>
>>> Ross
>
>
>
> _______________________________________________
> Emacs-orgmode mailing list
> Remember: use `Reply All' to send replies to the list.
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode

  reply	other threads:[~2008-07-10 23:30 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-07 22:21 org-agenda-list-stuck-projects and nested projects Ross Patterson
2008-07-08 17:06 ` Carsten Dominik
2008-07-08 17:47   ` Ross Patterson
2008-07-10 23:29     ` Ross Patterson [this message]
2008-07-14 19:17       ` Carsten Dominik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87iqvdco7f.fsf@transitory.lefae.org \
    --to=me@rpatterson.net \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).