From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bernt Hansen Subject: Re: Agenda todo filter order Date: Fri, 06 May 2011 13:40:38 -0400 Message-ID: <878vujiv6x.fsf@norang.ca> References: <87zknlhici.fsf@norang.ca> <87tydthi1x.fsf@norang.ca> <08D28BBE-80FF-4754-97BB-9674D2EB7CB5@gmail.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([140.186.70.92]:42569) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QIP1F-0005zV-MS for emacs-orgmode@gnu.org; Fri, 06 May 2011 13:40:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QIP1E-0005Hf-85 for emacs-orgmode@gnu.org; Fri, 06 May 2011 13:40:49 -0400 Received: from mho-03-ewr.mailhop.org ([204.13.248.66]:57143 helo=mho-01-ewr.mailhop.org) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QIP1E-0005H0-5U for emacs-orgmode@gnu.org; Fri, 06 May 2011 13:40:48 -0400 In-Reply-To: <08D28BBE-80FF-4754-97BB-9674D2EB7CB5@gmail.com> (Carsten Dominik's message of "Fri, 6 May 2011 08:24:58 +0200") 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: Carsten Dominik Cc: emacs-orgmode@gnu.org 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 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: > >> > 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