From: John Wiegley <jwiegley@gmail.com>
To: emacs-orgmode@gnu.org
Cc: Dave Abrahams <dave@boostpro.com>
Subject: Filtering agenda by the "top" category
Date: Wed, 04 Apr 2012 15:38:55 -0500 [thread overview]
Message-ID: <m2vclf8c68.fsf@gmail.com> (raw)
I discovered the < key in the agenda yesterday (by accident!), which filters
the Agenda down to entries having the same category.
However, I use both *categories* and *projects*. For example:
* Work
:CATEGORY: Work
:OVERLAY: (face (:background "#fdfdeb"))
** PROJECT Foo
:CATEGORY: Foo
I use :CATEGORY: for my project here so it shows up in the leftmost column of
my agenda. I don't want every project displaying as just "Work". I use the
:OVERLAY: so that all Work items have the same background color, which is a
better way of seeing at a glance which *category* every item falls into.
What this means is that although I can use < to filter by *project*, I can't
filter down to the "Work" *category*. So that's what the code below does. I
bind it to >, since I wasn't using what that binding does.
Also, I found a bug: passing a prefix argument to < doesn't have any effect.
The code doesn't use that argument in any meaningful way.
John
(define-key org-agenda-mode-map ">" 'org-agenda-filter-by-top-category)
(defun org-find-top-category (&optional pos)
(save-excursion
(with-current-buffer (if pos (marker-buffer pos) (current-buffer))
(if pos (goto-char pos))
;; Skip up to the topmost parent
(while (ignore-errors (outline-up-heading 1) t))
(ignore-errors
(nth 4 (org-heading-components))))))
(defvar org-agenda-filtered-by-top-category nil)
(defun org-agenda-filter-by-top-category (strip)
"Keep only those lines in the agenda buffer that have a specific category.
The category is that of the current line."
(interactive "P")
(if org-agenda-filtered-by-top-category
(progn
(setq org-agenda-filtered-by-top-category nil)
(org-agenda-filter-show-all-cat))
(let ((cat (org-find-top-category (org-get-at-bol 'org-hd-marker))))
(if cat (org-agenda-filter-top-category-apply cat)
(error "No top-level category at point")))))
(defun org-agenda-filter-top-category-apply (category)
"Set FILTER as the new agenda filter and apply it."
(org-agenda-set-mode-name)
(save-excursion
(goto-char (point-min))
(while (not (eobp))
(let* ((pos (org-get-at-bol 'org-hd-marker))
(topcat (and pos (org-find-top-category pos))))
(if (and topcat (not (string= category topcat)))
(org-agenda-filter-hide-line 'category)))
(beginning-of-line 2)))
(if (get-char-property (point) 'invisible)
(org-agenda-previous-line))
(setq org-agenda-filtered-by-top-category t))
next reply other threads:[~2012-04-04 20:39 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-04 20:38 John Wiegley [this message]
2012-04-10 20:42 ` Filtering agenda by the "top" category Bastien
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2vclf8c68.fsf@gmail.com \
--to=jwiegley@gmail.com \
--cc=dave@boostpro.com \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).