diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index a57d44fe3..0b7958116 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -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