Browse Source

Revert `org-agenda-filter-by-category' to non-prompting state

Carsten Dominik 6 years ago
parent
commit
7ee4cb0245
2 changed files with 35 additions and 16 deletions
  1. 15 15
      doc/org-manual.org
  2. 20 1
      lisp/org-agenda.el

+ 15 - 15
doc/org-manual.org

@@ -9085,10 +9085,10 @@ filter types.
 - {{{kbd(<)}}} (~org-agenda-filter-by-category~) ::
 - {{{kbd(<)}}} (~org-agenda-filter-by-category~) ::
 
 
   #+findex: org-agenda-filter-by-category
   #+findex: org-agenda-filter-by-category
-  Prompt for a category, defaulting to the category of the item at
-  point, and show only entries with this category.  Pressing
-  {{{kbd(<)}}} again removes this filter.  When called with a prefix
-  argument exclude the category of the item at point from the agenda.
+  Filter by category of the line at point, and show only entries with
+  this category.  Pressing {{{kbd(<)}}} again removes this filter.
+  When called with a prefix argument exclude the category of the item
+  at point from the agenda.
 
 
 - {{{kbd(=)}}} (~org-agenda-filter-by-regexp~) ::
 - {{{kbd(=)}}} (~org-agenda-filter-by-regexp~) ::
 
 
@@ -9125,12 +9125,20 @@ filter types.
   condition.  With two universal prefix arguments, it clears effort
   condition.  With two universal prefix arguments, it clears effort
   filters, which can be accumulated.
   filters, which can be accumulated.
 
 
+- {{{kbd(^)}}} (~org-agenda-filter-by-top-headline~) ::
+
+  #+findex: org-agenda-filter-by-top-headline
+  Filter the current agenda view and only display items that fall
+  under the same top-level headline as the current entry.  So this
+  simulated the effect of restricting the agenda creation to this
+  tree.
+
 - {{{kbd(/)}}} (~org-agenda-filter~) ::
 - {{{kbd(/)}}} (~org-agenda-filter~) ::
 
 
   #+findex: org-agenda-filter
   #+findex: org-agenda-filter
-  This is the unified interface to all four filter methods described
-  above.  At the prompt, specify different filter elements in a single
-  string, with full completion support.  For example,
+  This a the unified interface to four of the five filter methods
+  described above.  At the prompt, specify different filter elements
+  in a single string, with full completion support.  For example,
 
 
   #+begin_example
   #+begin_example
      +work-John+<0:10-/plot/
      +work-John+<0:10-/plot/
@@ -9148,14 +9156,6 @@ filter types.
   the front of the string, the new filter elements are added to the
   the front of the string, the new filter elements are added to the
   active ones.
   active ones.
 
 
-- {{{kbd(^)}}} (~org-agenda-filter-by-top-headline~) ::
-
-  #+findex: org-agenda-filter-by-top-headline
-  Filter the current agenda view and only display items that fall
-  under the same top-level headline as the current entry.  So this
-  simulated the effect of restricting the agenda creation to this
-  tree.
-
 - {{{kbd(|)}}} (~org-agenda-filter-remove-all~) ::
 - {{{kbd(|)}}} (~org-agenda-filter-remove-all~) ::
 
 
   Remove all filters in the current agenda view.
   Remove all filters in the current agenda view.

+ 20 - 1
lisp/org-agenda.el

@@ -7464,7 +7464,26 @@ With a prefix argument, do so in all agenda buffers."
   "Return the category of the agenda line."
   "Return the category of the agenda line."
   (org-get-at-bol 'org-category))
   (org-get-at-bol 'org-category))
 
 
-  
+(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."
+  (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-get-at-eol 'org-category 1))))
+      (cond
+       ((and cat strip)
+        (org-agenda-filter-apply
+         (push (concat "-" cat) org-agenda-category-filter) 'category))
+       (cat
+        (org-agenda-filter-apply
+         (setq org-agenda-category-filter
+	       (list (concat "+" cat))) 'category))
+       (t (error "No category at point"))))))
+
 (defun org-agenda-filter-by-category (strip)
 (defun org-agenda-filter-by-category (strip)
   "Filter lines in the agenda buffer that have a specific category.
   "Filter lines in the agenda buffer that have a specific category.
 The category is that of the current line.
 The category is that of the current line.