emacs-orgmode
[Top][All Lists]
Advanced

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

Re: [Orgmode] Searching for tags or todo keywords


From: Carsten Dominik
Subject: Re: [Orgmode] Searching for tags or todo keywords
Date: Sat, 13 Sep 2008 21:10:15 +0200

Hi Peter,

as you have seen, changing the logic is not easy, for a number of reasons. I would like to have parenthesis, but since the parsing is done by string processing, any parenthesis in one of the search strings would be difficult to handle.

Some work-arounds:

1. Have you thought about using a sparse tree? Or is you stuff in different files?

2. You could use categories to mark the entries. Basically make each project its own category.

3. Have you tried follow mode in the agenda? Then you will always see, in another window, the embedding of the entry you are looking at.


HTH

- Carsten

On Aug 22, 2008, at 3:21 PM, Peter Westlake wrote:

I only discovered org-mode a couple of weeks ago, so apologies if this
is a FAQ, or the patch is in the wrong format.

I would like to define an agenda command to show TODO items in the
context of the projects to which they belong, like this:

 todo:       .Widget project
 todo:       ..TODO Gather widget requirements
 todo:       .Gadget project
 todo:       ..TODO Plan the end of project party

That would be a search like:

 (LEVEL=2) | (/TODO)

But LEVEL=2|/TODO is interpreted as (LEVEL=2|) & (/TODO)
because / has the lowest precedence.

/TODO|LEVEL=2 treats LEVEL as a TODO word instead of a tag.

Is there any way around this, short of implementing parentheses?

One possibility might be to make operators that are like / but bind most
tightly, one to say "this is a todo keyword" and one to say "this is a
tag". For instance, if \ was like / but high precedence, and % was the
opposite of \, my query would become:

 \TODO | %LEVEL=2

Having looked at the code, that looks almost as hard as parens.

Next idea: since "/" means "and this TODO expression", add "\" meaning
"or this TODO expression". So my query becomes:

 LEVEL=2\TODO

This is a lot easier to implement. In fact, this patch does it:

diff -wu /usr/share/emacs/site-lisp/org-mode/org.el
/home/pwestlake/elisp/org.el
--- /usr/share/emacs/site-lisp/org-mode/org.el  2008-06-17
20:36:44.000000000 +0100
+++ /home/pwestlake/elisp/org.el        2008-08-22 14:13:44.031536000
+0100
@@ -9381,17 +9381,26 @@
       tagsmatch todomatch tagsmatcher todomatcher kwd matcher
       orterms term orlist re-p str-p level-p level-op
       prop-p pn pv po cat-p gv)
-    (if (string-match "/+" match)
+    (cond ((string-match "/+" match)
       ;; match contains also a todo-matching request
-       (progn
         (setq tagsmatch (substring match 0 (match-beginning 0))
               todomatch (substring match (match-end 0)))
         (if (string-match "^!" todomatch)
             (setq todo-only t todomatch (substring todomatch 1)))
         (if (string-match "^\\s-*$" todomatch)
-             (setq todomatch nil)))
+               (setq todomatch nil))
+           (setq todo-op 'and todo-op-default t))
+          ((string-match "\\\\+" match)
+           (setq tagsmatch (substring match 0 (match-beginning 0))
+                 todomatch (substring match (match-end 0)))
+           (if (string-match "^!" todomatch)
+               (setq todo-only t todomatch (substring todomatch 1)))
+           (if (string-match "^\\s-*$" todomatch)
+               (setq todomatch nil))
+           (setq todo-op 'or todo-op-default nil))
+
      ;; only matching tags
-      (setq tagsmatch match todomatch nil))
+          (t (setq tagsmatch match todomatch nil todo-op-default t
todo-op 'and)))

    ;; Make the tags matcher
    (if (or (not tagsmatch) (not (string-match "\\S-" tagsmatch)))
@@ -9447,7 +9456,7 @@
           (list 'progn '(setq org-cached-props nil) tagsmatcher)))
    ;; Make the todo matcher
    (if (or (not todomatch) (not (string-match "\\S-" todomatch)))
-       (setq todomatcher t)
+       (setq todomatcher todo-op-default)
      (setq orterms (org-split-string todomatch "|") orlist nil)
      (while (setq term (pop orterms))
       (while (string-match re term)
@@ -9471,7 +9480,7 @@

    ;; Return the string and lisp forms of the matcher
    (setq matcher (if todomatcher
-                     (list 'and tagsmatcher todomatcher)
+                     (list todo-op tagsmatcher todomatcher)
                   tagsmatcher))
    (cons match0 matcher)))


Regards,

Peter.




_______________________________________________
Emacs-orgmode mailing list
Remember: use `Reply All' to send replies to the list.
address@hidden
http://lists.gnu.org/mailman/listinfo/emacs-orgmode





reply via email to

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