>From 4e52c8c724f57c981206dbffff18c95f9fe285af Mon Sep 17 00:00:00 2001 From: Toby S. Cubitt Date: Sat, 28 Jan 2012 18:26:21 +0100 Subject: [PATCH 2/2] Agenda: Add new todo-unblocked and nottodo-unblocked skip conditions * lisp/org-agenda.el (org-agenda-skip-if, org-agenda-skip-if-todo): Add new todo-unblocked and nottodo-unblocked skip conditions. These match as for todo and nottodo, but only for unblocked todo items. --- lisp/org-agenda.el | 26 ++++++++++++++++++++------ 1 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index ad706eb..d411732 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -4286,15 +4286,18 @@ that can be put into `org-agenda-skip-function' for the duration of a command." (not (re-search-forward (nth 1 m) end t))) (and (or (setq m (memq 'nottodo conditions)) + (setq m (memq 'todo-unblocked conditions)) + (setq m (memq 'nottodo-unblocked conditions)) (setq m (memq 'todo conditions))) (org-agenda-skip-if-todo m end))) end))) (defun org-agenda-skip-if-todo (args end) "Helper function for `org-agenda-skip-if', do not use it directly. -ARGS is a list with first element either `todo' or `nottodo'. -The remainder is either a list of TODO keywords, or a state symbol -`todo' or `done' or `any'." +ARGS is a list with first element either `todo', `nottodo', +`todo-unblocked' or `nottodo-unblocked'. The remainder is either +a list of TODO keywords, or a state symbol `todo' or `done' or +`any'." (let ((kw (car args)) (arg (cadr args)) todo-wds todo-re) @@ -4318,9 +4321,20 @@ The remainder is either a list of TODO keywords, or a state symbol (concat "^\\*+[ \t]+\\<\\(" (mapconcat 'identity todo-wds "\\|") "\\)\\>")) - (if (eq kw 'todo) - (re-search-forward todo-re end t) - (not (re-search-forward todo-re end t))))) + (cond + ((eq kw 'todo) (re-search-forward todo-re end t)) + ((eq kw 'nottodo) (not (re-search-forward todo-re end t))) + ((eq kw 'todo-unblocked) + (catch 'unblocked + (while (re-search-forward todo-re end t) + (or (org-entry-blocked-p) (throw 'unblocked t))) + nil)) + ((eq kw 'nottodo-unblocked) + (catch 'unblocked + (while (re-search-forward todo-re end t) + (or (org-entry-blocked-p) (throw 'unblocked nil))) + t)) + ))) ;;;###autoload (defun org-agenda-list-stuck-projects (&rest ignore) -- 1.7.3.4