Normalize the use of `C-u' in `org-agenda-filter'

* lisp/org-agenda.el (org-agenda-filter): Make the applications of
single and double prefix arguments consistent with other filtering commands.
This commit is contained in:
Carsten Dominik 2019-09-06 10:17:35 +02:00
parent d1bdf6c789
commit 697358605a
1 changed files with 18 additions and 11 deletions

View File

@ -7578,10 +7578,8 @@ With two prefix arguments, remove the effort filters."
(message "Effort filter removed")))) (message "Effort filter removed"))))
(defun org-agenda-filter (&optional keep) (defun org-agenda-filter (&optional strip)
"Prompt for a general filter string and apply it to the agenda. "Prompt for a general filter string and apply it to the agenda.
The new filter replaces all existing elements. When called with a
prefix arg KEEP, add the new elements to the existing filter.
The string may contain filter elements like The string may contain filter elements like
@ -7604,14 +7602,17 @@ values is offered. Since the syntax for categories and tags is identical
there should be no overlap between categoroes and tags. If there is, tags there should be no overlap between categoroes and tags. If there is, tags
get priority. get priority.
Instead of using the prefix argument to add to the current filter A single universal `C-u' prefix arg STRIP will negate the entire filter,
set, you can also add an additional leading `+' to filter string, which can be useful in connection with the prompt history.
like `+-John'.
With a double prefix argument, execute the computed filtering defined in A double `C-u C-u' prefix arg will add the new filter elements to the
existing ones. A shortcut for this is to add an additional `+' at the
beginning of the string, like `+-John'.
With a triple prefix argument, execute the computed filtering defined in
the variable `org-agenda-auto-exclude-function'." the variable `org-agenda-auto-exclude-function'."
(interactive "P") (interactive "P")
(if (equal keep '(16)) (if (equal strip '(64))
;; Execute the auto-exclude action ;; Execute the auto-exclude action
(if (not org-agenda-auto-exclude-function) (if (not org-agenda-auto-exclude-function)
(user-error "`org-agenda-auto-exclude-function' is undefined") (user-error "`org-agenda-auto-exclude-function' is undefined")
@ -7626,11 +7627,15 @@ the variable `org-agenda-auto-exclude-function'."
;; Prompt for a filter and act ;; Prompt for a filter and act
(let* ((tag-list (org-agenda-get-represented-tags)) (let* ((tag-list (org-agenda-get-represented-tags))
(category-list (org-agenda-get-represented-categories)) (category-list (org-agenda-get-represented-categories))
(f-string (completing-read "Filter [+cat-tag<0:10-/regexp/]: " (negate (equal strip '(4)))
(f-string (completing-read
(concat
(if negate "Negative filter" "Filter")
" [+cat-tag<0:10-/regexp/]: ")
'org-agenda-filter-completion-function)) 'org-agenda-filter-completion-function))
(keep (or (if (string-match "^+[-+]" f-string) (keep (or (if (string-match "^+[-+]" f-string)
(progn (setq f-string (substring f-string 1)) t)) (progn (setq f-string (substring f-string 1)) t))
keep)) (equal strip '(16))))
(fc (if keep org-agenda-category-filter)) (fc (if keep org-agenda-category-filter))
(ft (if keep org-agenda-tag-filter)) (ft (if keep org-agenda-tag-filter))
(fe (if keep org-agenda-effort-filter)) (fe (if keep org-agenda-effort-filter))
@ -7638,6 +7643,8 @@ the variable `org-agenda-auto-exclude-function'."
pm s) pm s)
(while (string-match "^[ \t]*\\([-+]\\)?\\(\\([^-+<>=/ \t]+\\)\\|\\([<>=][0-9:]+\\)\\|\\(/\\([^/]+\\)/?\\)\\)" f-string) (while (string-match "^[ \t]*\\([-+]\\)?\\(\\([^-+<>=/ \t]+\\)\\|\\([<>=][0-9:]+\\)\\|\\(/\\([^/]+\\)/?\\)\\)" f-string)
(setq pm (if (match-beginning 1) (match-string 1 f-string) "+")) (setq pm (if (match-beginning 1) (match-string 1 f-string) "+"))
(when negate
(setq pm (if (equal pm "+") "-" "+")))
(cond (cond
((match-beginning 3) ((match-beginning 3)
;; category or tag ;; category or tag