Browse Source

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.
Carsten Dominik 10 months ago
parent
commit
8dfe826a0b
1 changed files with 17 additions and 4 deletions
  1. 17 4
      lisp/org-agenda.el

+ 17 - 4
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