From mboxrd@z Thu Jan 1 00:00:00 1970 From: Toby Cubitt Subject: [PATCH] Add new '[not]todo-unblocked tests to org-agenda-skip-if Date: Sun, 12 Feb 2012 22:18:44 +0100 Message-ID: <20120212211844.GA12775@c3po.home> Reply-To: Toby Cubitt Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="4Ckj6UjgE2iN1+kY" Return-path: Received: from eggs.gnu.org ([140.186.70.92]:38460) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RwgpZ-0001yn-MC for emacs-orgmode@gnu.org; Sun, 12 Feb 2012 16:19:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RwgpY-0000aV-FK for emacs-orgmode@gnu.org; Sun, 12 Feb 2012 16:19:33 -0500 Received: from sanddollar.geekisp.com ([216.168.135.167]:29500) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RwgpY-0000aO-70 for emacs-orgmode@gnu.org; Sun, 12 Feb 2012 16:19:32 -0500 Content-Disposition: inline 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: emacs-orgmode@gnu.org --4Ckj6UjgE2iN1+kY Content-Type: text/plain; charset=us-ascii Content-Disposition: inline This patch adds two new tests to `org-agenda-skip-if': 'todo-unblocked and 'nottodo-unblocked. These match like 'todo and 'nottodo, but only on unblocked todo items. This type of test is useful when compiling custom agenda views containing lists of currently actionable todo items. Whilst it's possible to code such tests in `org-agenda-custom-commands' directly (well, Elisp is Turing-complete: you can in principle code anything!), it's far less convenient than a simple `org-agenda-skip-if' test which can reuse much of the existing machinery. Note that the attached patch applies on top of my other "Fix org-agenda-skip-if bug" patch, though this new feature is independent of that bug-fix. Toby -- Dr T. S. Cubitt Mathematics and Quantum Information group Department of Mathematics Complutense University Madrid, Spain email: tsc25@cantab.net web: www.dr-qubit.org --4Ckj6UjgE2iN1+kY Content-Type: text/x-patch; charset=us-ascii Content-Disposition: attachment; filename="0002-Agenda-Add-new-todo-unblocked-and-nottodo-unblocked-.patch" >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 --4Ckj6UjgE2iN1+kY--