Agenda category filter now offers completion for categories

* lisp/org-agenda.el (org-agenda-all-categories): New function.
(org-agenda-filter-by-category): Implement completion on categories.
This commit is contained in:
Carsten Dominik 2019-08-21 14:57:15 +02:00
parent 7893737406
commit 8dfe826a0b
1 changed files with 17 additions and 4 deletions

View File

@ -7439,17 +7439,30 @@ With a prefix argument, do so in all agenda buffers."
"Return the category of the agenda line."
(org-get-at-bol 'org-category))
(defun org-agenda-all-categories ()
"Return a list of all categories used in this agenda buffer."
(let ((pos (point-min)) categories)
(while (and (< pos (point-max))
(setq pos (next-single-property-change
pos 'org-category nil (point-max))))
(push (get-text-property pos 'org-category) categories))
(nreverse (org-uniquify (delq nil categories)))))
(defun org-agenda-filter-by-category (strip)
"Filter lines in the agenda buffer that have a specific category.
The category is that of the current line.
Without prefix argument, keep only the lines of that category.
With a prefix argument, exclude the lines of that category.
"
Without prefix argument STRIP, keep only the lines of that category.
With a prefix argument, exclude the lines of that category."
(interactive "P")
(if (and org-agenda-filtered-by-category
org-agenda-category-filter)
(org-agenda-filter-show-all-cat)
(let ((cat (org-no-properties (org-agenda-get-category))))
(let* ((categories (org-agenda-all-categories))
(defcat (org-no-properties (or (org-agenda-get-category)
(car categories))))
(cat (completing-read (format "Category [%s]: " defcat)
(org-agenda-all-categories)
nil t nil nil defcat)))
(cond
((and cat strip)
(org-agenda-filter-apply