emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] Agenda todo filter order


From: Bernt Hansen
Subject: Re: [O] Agenda todo filter order
Date: Fri, 06 May 2011 13:40:38 -0400
User-agent: Gnus/5.110017 (No Gnus v0.17) Emacs/23.2 (gnu/linux)

Hi Carsten,

Thanks for the patch!  This almost does what I want :)

This patch works for TODO agendas but not tags match agendas which is
what I am trying to use.

C-c a y returns the result I want
C-c a x should be identical and is not.


,----[ C-c a y ]
| Non Project TODO Tasks
|   test:       TODO Single Task
|   test:       TODO Task Three
|   test:       TODO Task Four
`----

,----[ C-c a x ]
| Non Project Tasks
|   test:       TODO Single Task
|   test:       TODO Subtask Four
|   test:       TODO Subtask Five
|   test:       TODO Subtask Six
|   test:       TODO Subtask Seven
|   test:       TODO Subtask Eight
|   test:       TODO Subtask Nine
|   test:       TODO Task Three
|   test:       TODO Task Four
`----


Below is the minimal emacs setup which I'm using to test:

Regards,
Bernt

~/bin/minimal-emacs
--8<---------------cut here---------------start------------->8---
#!/bin/sh
TESTEL=
TESTFILE=/tmp/test.el
if test -e $TESTFILE
then
  TESTEL="-l /tmp/test.el"
fi
emacs -q -l ~/minimal.emacs $TESTEL $1
--8<---------------cut here---------------end--------------->8---

~/minimal.emacs
--8<---------------cut here---------------start------------->8---
(add-to-list 'load-path (expand-file-name "~/git/org-mode/lisp"))
(add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\|txt\\)$" . org-mode))
(require 'org-install)

(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cb" 'org-iswitchb)
--8<---------------cut here---------------end--------------->8---

/tmp/test.el
--8<---------------cut here---------------start------------->8---
(setq org-agenda-files (list "/tmp/test.org"))
(setq org-agenda-todo-ignore-scheduled t)
(setq org-agenda-todo-ignore-deadlines t)
(setq org-agenda-tags-todo-honor-ignore-options t)
(setq org-agenda-custom-commands (quote (("x" "Non-Project Tasks" tags-todo "/!"
                                          ((org-agenda-overriding-header "Non 
Project Tasks")
                                           (org-agenda-skip-function 
'bh/skip-project-trees)))
                                         ("y" "Non-Project TODO Tasks" todo ""
                                          ((org-agenda-overriding-header "Non 
Project TODO Tasks")
                                           (org-agenda-skip-function 
'bh/skip-project-trees))))))

(defun bh/is-subproject-p ()
  "Any task which is a subtask of another project"
  (let ((is-subproject)
        (is-a-task (member (nth 2 (org-heading-components)) 
org-todo-keywords-1)))
    (save-excursion
      (while (and (not is-subproject) (org-up-heading-safe))
        (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
          (setq is-subproject t))))
    (and is-a-task is-subproject)))

(defun bh/is-project-p ()
  "Any task with a todo keyword subtask and is not a subtask of another project
This does not support projects with subprojects"
  (let ((has-subtask)
        (subtree-end (save-excursion (org-end-of-subtree t)))
        (is-subproject (bh/is-subproject-p))
        (is-a-task (member (nth 2 (org-heading-components)) 
org-todo-keywords-1)))
    (save-excursion
      (forward-line 1)
      (while (and (not has-subtask)
                  (< (point) subtree-end)
                  (re-search-forward "^\*+ " subtree-end t))
        (when (member (org-get-todo-state) org-todo-keywords-1)
          (setq has-subtask t))))
    (and is-a-task has-subtask (not is-subproject))))

(defun bh/skip-project-trees ()
  "Skip trees that are projects"
  (let ((subtree-end (save-excursion (org-end-of-subtree t))))
    (cond
     ((bh/is-project-p)
      subtree-end)
     (t
      nil))))

--8<---------------cut here---------------end--------------->8---

/tmp/test.org
--8<---------------cut here---------------start------------->8---
* TODO Single Task
* TODO Project One
** TODO Subtask One
** TODO Subtask Two
** TODO Subtask Three
* TODO Project Two
  DEADLINE: <2011-05-13 Fri>
** TODO Subtask Four
** TODO Subtask Five
** TODO Subtask Six
* TODO Project Three
  SCHEDULED: <2011-05-08 Sun>
** TODO Subtask Seven
** TODO Subtask Eight
** TODO Subtask Nine
* Tasks
** TODO Task One
   DEADLINE: <2011-05-20 Fri>
** TODO Task Two
   SCHEDULED: <2011-05-13 Fri>
** TODO Task Three
** TODO Task Four
--8<---------------cut here---------------end--------------->8---


Carsten Dominik <address@hidden> writes:

> Hi Bernt,
>
> I don't see a compelling reason why these two skipping checks could not
> be exchanged:
> -----------------------------------------------------------------------------------
> diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
> index 609edd4..a386a18 100644
> --- a/lisp/org-agenda.el
> +++ b/lisp/org-agenda.el
> @@ -4573,6 +4573,7 @@ the documentation of `org-diary'."
>      (goto-char (point-min))
>      (while (re-search-forward regexp nil t)
>        (catch :skip
> +     (org-agenda-skip)
>       (save-match-data
>         (beginning-of-line)
>         (setq beg (point) end (save-excursion (outline-next-heading) (point)))
> @@ -4581,7 +4582,6 @@ the documentation of `org-diary'."
>           (or org-agenda-todo-list-sublevels (org-end-of-subtree 'invisible))
>           (throw :skip nil)))
>       (goto-char beg)
> -     (org-agenda-skip)
>       (goto-char (match-beginning 1))
>       (setq marker (org-agenda-new-marker (match-beginning 0))
>             category (org-get-category)
> -----------------------------------------------------------------------------------
>
> Does anyone else see a reason why this could cause a problem?
>
> Bernt, maybe just try out this patch and report back?
>
> - Carsten
>
>
> On 20.4.2011, at 02:39, Bernt Hansen wrote:
>
>> <Sorry for the double post - hit C-c C-s in Gnus trying to set the
>> scheduled date and that sends the message... oops>
>> 
>> Hi Carsten,
>> 
>> I'm trying to tune my shiny new block agenda so it has a section that
>> displays non-project tasks without a scheduled date or deadline date in
>> the future.
>> 
>> I have a non-standard skipping function that skips project trees which
>> I'm using in this agenda so what is left should only be non-project
>> tasks.  My agenda with only this non-standard skipping function works
>> perfectly and gives me a list of only non-project tasks.
>> 
>> I don't really want to see non-project tasks with a scheduled or
>> deadline date in the future.  I added org-agenda-todo-ignore-scheduled
>> and org-agenda-todo-ignore-deadlines to 'future to this agenda view and
>> now I get extra project tasks in the list which is incorrect.
>> 
>> It seems the org-agenda-todo-ignore-scheduled (and deadlines) vars are
>> applied to the list of todo tasks first -- so any projects that have a
>> scheduled or deadline date are skipped (but not the entire tree - just
>> the top-level project task) -- this makes all of the project subtasks
>> appear in my 'non-project' task list which is wrong.
>> 
>> If the non-standard skipping function was applied first and then the
>> test for scheduled/deadline I think it work work the way I want.  Is
>> this hard to change?
>> 
>> Example:
>> 
>> --8<---------------cut here---------------start------------->8---
>> * TODO Project task
>>  SCHEDULED: <2011-04-12 Tue>
>> ** TODO Subtask 1
>> ** TODO Subtask 2
>> * TODO Non project task
>> * TODO Another non-project-task
>>  DEADLINE: <2011-06-03 Fri>
>> * TODO Some future non-project task
>>  SCHEDULED: <2011-06-18 Sat>
>> --8<---------------cut here---------------end--------------->8---
>> 
>> My agenda view for non-project tasks should show only
>> 
>> * TODO Non project task
>> * TODO Another non-project-task
>> * TODO Some future non-project task
>> 
>> but with (setq org-agenda-todo-ignore-scheduled 'future) the top level
>> 'Project task' is skipped and 'Subtask 1' show up (and is considered not
>> a project since it has no subtasks)
>> 
>> If this can't be changed for some technical reason I guess I can make my
>> skipping function more intelligent and look up the hierarchy as well to
>> make sure this task is not under some other project task but I didn't
>> think that would be necessary to accomplish what I want.
>> 
>> Do you have any suggestions for how I get to my desired end result?
>> 
>> Regards,
>> Bernt



reply via email to

[Prev in Thread] Current Thread [Next in Thread]