Skip to content

Commit edf5afc

Browse files
ilupinyantar92
authored andcommitted
Fix filter preset problem for sticky agenda
* lisp/org-agenda.el (org-agenda-local-vars): (org-agenda-filters-preset): Add a new variable `org-agenda-filters-preset' for storing per-buffer filter presets. (org-agenda): (org-agenda-filter-any): (org-agenda-prepare): (org-agenda-finalize): (org-agenda-redo): (org-agenda-filter-by-tag): (org-agenda-filter-make-matcher): (org-agenda-set-mode-name): (org-agenda-reapply-filters): Use `org-agenda-filters-preset' for getting and setting per-buffer filter presets, rather than modifying the global symbol property. Change `org-lprops' from symbol property to per-buffer text property. Delete unused `last-args' symbol property. * testing/lisp/test-org-agenda.el (test-org-agenda/sticky-agenda-filter-preset): (test-org-agenda/redo-setting): Add tests.
1 parent 580f286 commit edf5afc

File tree

2 files changed

+109
-59
lines changed

2 files changed

+109
-59
lines changed

lisp/org-agenda.el

Lines changed: 49 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -2276,6 +2276,7 @@ When nil, `q' will kill the single agenda buffer."
22762276
org-agenda-top-headline-filter
22772277
org-agenda-regexp-filter
22782278
org-agenda-effort-filter
2279+
org-agenda-filters-preset
22792280
org-agenda-markers
22802281
org-agenda-last-search-view-search-was-boolean
22812282
org-agenda-last-indirect-buffer
@@ -2929,10 +2930,6 @@ Pressing `<' twice means to restrict to the current subtree or region
29292930
(setq org-agenda-restrict nil)
29302931
(move-marker org-agenda-restrict-begin nil)
29312932
(move-marker org-agenda-restrict-end nil))
2932-
;; Delete old local properties
2933-
(put 'org-agenda-redo-command 'org-lprops nil)
2934-
;; Delete previously set last-arguments
2935-
(put 'org-agenda-redo-command 'last-args nil)
29362933
;; Remember where this call originated
29372934
(setq org-agenda-last-dispatch-buffer (current-buffer))
29382935
(unless org-keys
@@ -2981,7 +2978,6 @@ Pressing `<' twice means to restrict to the current subtree or region
29812978
(setq org-agenda-buffer-name
29822979
(or (and (stringp org-match) (format "*Org Agenda(%s:%s)*" org-keys org-match))
29832980
(format "*Org Agenda(%s)*" org-keys))))
2984-
(put 'org-agenda-redo-command 'org-lprops lprops)
29852981
(cl-progv
29862982
(mapcar #'car lprops)
29872983
(mapcar (lambda (binding) (eval (cadr binding) t)) lprops)
@@ -3016,7 +3012,10 @@ Pressing `<' twice means to restrict to the current subtree or region
30163012
(funcall type org-match))
30173013
;; FIXME: Will signal an error since it's not `functionp'!
30183014
((pred fboundp) (funcall type org-match))
3019-
(_ (user-error "Invalid custom agenda command type %s" type)))))
3015+
(_ (user-error "Invalid custom agenda command type %s" type))))
3016+
(let ((inhibit-read-only t))
3017+
(add-text-properties (point-min) (point-max)
3018+
`(org-lprops ,lprops))))
30203019
(org-agenda-run-series (nth 1 entry) (cddr entry))))
30213020
((equal org-keys "C")
30223021
(setq org-agenda-custom-commands org-agenda-custom-commands-orig)
@@ -3808,6 +3807,10 @@ the entire agenda view. In a block agenda, it will not work reliably to
38083807
define a filter for one of the individual blocks. You need to set it in
38093808
the global options and expect it to be applied to the entire view.")
38103809

3810+
(defvar org-agenda-filters-preset nil
3811+
"Alist of filter types and associated preset of filters.
3812+
This variable is local in `org-agenda' buffers. See `org-agenda-local-vars'.")
3813+
38113814
(defconst org-agenda-filter-variables
38123815
'((category . org-agenda-category-filter)
38133816
(tag . org-agenda-tag-filter)
@@ -3818,7 +3821,7 @@ the global options and expect it to be applied to the entire view.")
38183821
"Is any filter active?"
38193822
(cl-some (lambda (x)
38203823
(or (symbol-value (cdr x))
3821-
(get :preset-filter x)))
3824+
(assoc-default (car x) org-agenda-filters-preset)))
38223825
org-agenda-filter-variables))
38233826

38243827
(defvar org-agenda-category-filter-preset nil
@@ -3927,25 +3930,13 @@ FILTER-ALIST is an alist of filters we need to apply when
39273930
(cat . ,org-agenda-category-filter))))))
39283931
(if (org-agenda-use-sticky-p)
39293932
(progn
3930-
(put 'org-agenda-tag-filter :preset-filter nil)
3931-
(put 'org-agenda-category-filter :preset-filter nil)
3932-
(put 'org-agenda-regexp-filter :preset-filter nil)
3933-
(put 'org-agenda-effort-filter :preset-filter nil)
39343933
;; Popup existing buffer
39353934
(org-agenda-prepare-window (get-buffer org-agenda-buffer-name)
39363935
filter-alist)
39373936
(message "Sticky Agenda buffer, use `r' to refresh")
39383937
(or org-agenda-multi (org-agenda-fit-window-to-buffer))
39393938
(throw 'exit "Sticky Agenda buffer, use `r' to refresh"))
39403939
(setq org-todo-keywords-for-agenda nil)
3941-
(put 'org-agenda-tag-filter :preset-filter
3942-
org-agenda-tag-filter-preset)
3943-
(put 'org-agenda-category-filter :preset-filter
3944-
org-agenda-category-filter-preset)
3945-
(put 'org-agenda-regexp-filter :preset-filter
3946-
org-agenda-regexp-filter-preset)
3947-
(put 'org-agenda-effort-filter :preset-filter
3948-
org-agenda-effort-filter-preset)
39493940
(if org-agenda-multi
39503941
(progn
39513942
(setq buffer-read-only nil)
@@ -3970,7 +3961,12 @@ FILTER-ALIST is an alist of filters we need to apply when
39703961
(setq org-agenda-buffer (current-buffer))
39713962
(setq org-agenda-contributing-files nil)
39723963
(setq org-agenda-columns-active nil)
3973-
(org-agenda-prepare-buffers (org-agenda-files nil 'ifmode))
3964+
(setq org-agenda-filters-preset
3965+
`((tag . ,org-agenda-tag-filter-preset)
3966+
(category . ,org-agenda-category-filter-preset)
3967+
(regexp . ,org-agenda-regexp-filter-preset)
3968+
(effort . ,org-agenda-effort-filter-preset)))
3969+
(org-agenda-prepare-buffers (org-agenda-files nil 'ifmode))
39743970
(setq org-todo-keywords-for-agenda
39753971
(org-uniquify org-todo-keywords-for-agenda))
39763972
(setq org-done-keywords-for-agenda
@@ -4040,24 +4036,24 @@ agenda display, configure `org-agenda-finalize-hook'."
40404036
org-agenda-top-headline-filter))
40414037
(when org-agenda-tag-filter
40424038
(org-agenda-filter-apply org-agenda-tag-filter 'tag t))
4043-
(when (get 'org-agenda-tag-filter :preset-filter)
4039+
(when (assoc-default 'tag org-agenda-filters-preset)
40444040
(org-agenda-filter-apply
4045-
(get 'org-agenda-tag-filter :preset-filter) 'tag t))
4041+
(assoc-default 'tag org-agenda-filters-preset) 'tag t))
40464042
(when org-agenda-category-filter
40474043
(org-agenda-filter-apply org-agenda-category-filter 'category))
4048-
(when (get 'org-agenda-category-filter :preset-filter)
4044+
(when (assoc-default 'category org-agenda-filters-preset)
40494045
(org-agenda-filter-apply
4050-
(get 'org-agenda-category-filter :preset-filter) 'category))
4046+
(assoc-default 'category org-agenda-filters-preset) 'category))
40514047
(when org-agenda-regexp-filter
40524048
(org-agenda-filter-apply org-agenda-regexp-filter 'regexp))
4053-
(when (get 'org-agenda-regexp-filter :preset-filter)
4049+
(when (assoc-default 'regexp org-agenda-filters-preset)
40544050
(org-agenda-filter-apply
4055-
(get 'org-agenda-regexp-filter :preset-filter) 'regexp))
4051+
(assoc-default 'regexp org-agenda-filters-preset) 'regexp))
40564052
(when org-agenda-effort-filter
40574053
(org-agenda-filter-apply org-agenda-effort-filter 'effort))
4058-
(when (get 'org-agenda-effort-filter :preset-filter)
4054+
(when (assoc-default 'effort org-agenda-filters-preset)
40594055
(org-agenda-filter-apply
4060-
(get 'org-agenda-effort-filter :preset-filter) 'effort))
4056+
(assoc-default 'effort org-agenda-filters-preset) 'effort))
40614057
(add-hook 'kill-buffer-hook #'org-agenda-reset-markers 'append 'local))
40624058
(run-hooks 'org-agenda-finalize-hook))))
40634059

@@ -8098,19 +8094,19 @@ in the agenda."
80988094
org-agenda-buffer-name))
80998095
(org-agenda-keep-modes t)
81008096
(tag-filter org-agenda-tag-filter)
8101-
(tag-preset (get 'org-agenda-tag-filter :preset-filter))
8097+
(tag-preset (assoc-default 'tag org-agenda-filters-preset))
81028098
(top-hl-filter org-agenda-top-headline-filter)
81038099
(cat-filter org-agenda-category-filter)
8104-
(cat-preset (get 'org-agenda-category-filter :preset-filter))
8100+
(cat-preset (assoc-default 'category org-agenda-filters-preset))
81058101
(re-filter org-agenda-regexp-filter)
8106-
(re-preset (get 'org-agenda-regexp-filter :preset-filter))
8102+
(re-preset (assoc-default 'regexp org-agenda-filters-preset))
81078103
(effort-filter org-agenda-effort-filter)
8108-
(effort-preset (get 'org-agenda-effort-filter :preset-filter))
8104+
(effort-preset (assoc-default 'effort org-agenda-filters-preset))
81098105
(org-agenda-tag-filter-while-redo (or tag-filter tag-preset))
81108106
(cols org-agenda-columns-active)
81118107
(line (org-current-line))
81128108
(window-line (- line (org-current-line (window-start))))
8113-
(lprops (get 'org-agenda-redo-command 'org-lprops))
8109+
(lprops (get-text-property p 'org-lprops))
81148110
(redo-cmd (get-text-property p 'org-redo-cmd))
81158111
(last-args (get-text-property p 'org-last-args))
81168112
(org-agenda-overriding-cmd (get-text-property p 'org-series-cmd))
@@ -8121,18 +8117,16 @@ in the agenda."
81218117
((stringp last-args)
81228118
last-args))))
81238119
(series-redo-cmd (get-text-property p 'org-series-redo-cmd)))
8124-
(put 'org-agenda-tag-filter :preset-filter nil)
8125-
(put 'org-agenda-category-filter :preset-filter nil)
8126-
(put 'org-agenda-regexp-filter :preset-filter nil)
8127-
(put 'org-agenda-effort-filter :preset-filter nil)
81288120
(and cols (org-columns-quit))
81298121
(message "Rebuilding agenda buffer...")
81308122
(if series-redo-cmd
81318123
(eval series-redo-cmd t)
81328124
(cl-progv
81338125
(mapcar #'car lprops)
81348126
(mapcar (lambda (binding) (eval (cadr binding) t)) lprops)
8135-
(eval redo-cmd t)))
8127+
(eval redo-cmd t))
8128+
(let ((inhibit-read-only t))
8129+
(add-text-properties (point-min) (point-max) `(org-lprops ,lprops))))
81368130
(setq org-agenda-undo-list nil
81378131
org-agenda-pending-undo-list nil
81388132
org-agenda-tag-filter tag-filter
@@ -8141,10 +8135,6 @@ in the agenda."
81418135
org-agenda-effort-filter effort-filter
81428136
org-agenda-top-headline-filter top-hl-filter)
81438137
(message "Rebuilding agenda buffer...done")
8144-
(put 'org-agenda-tag-filter :preset-filter tag-preset)
8145-
(put 'org-agenda-category-filter :preset-filter cat-preset)
8146-
(put 'org-agenda-regexp-filter :preset-filter re-preset)
8147-
(put 'org-agenda-effort-filter :preset-filter effort-preset)
81488138
(let ((tag (or tag-filter tag-preset))
81498139
(cat (or cat-filter cat-preset))
81508140
(effort (or effort-filter effort-preset))
@@ -8540,7 +8530,7 @@ also press `-' or `+' to switch between filtering and excluding."
85408530
(org-agenda-filter-apply org-agenda-tag-filter 'tag expand))))
85418531
((eq char ?\\)
85428532
(org-agenda-filter-show-all-tag)
8543-
(when (get 'org-agenda-tag-filter :preset-filter)
8533+
(when (assoc-default 'tag org-agenda-filters-preset)
85448534
(org-agenda-filter-apply org-agenda-tag-filter 'tag expand)))
85458535
((eq char ?.)
85468536
(setq org-agenda-tag-filter
@@ -8613,7 +8603,7 @@ grouptags."
86138603
((eq type 'tag)
86148604
(setq filter
86158605
(delete-dups
8616-
(append (get 'org-agenda-tag-filter :preset-filter)
8606+
(append (assoc-default 'tag org-agenda-filters-preset)
86178607
filter)))
86188608
(dolist (x filter)
86198609
(let ((op (string-to-char x)))
@@ -8625,7 +8615,7 @@ grouptags."
86258615
((eq type 'category)
86268616
(setq filter
86278617
(delete-dups
8628-
(append (get 'org-agenda-category-filter :preset-filter)
8618+
(append (assoc-default 'category org-agenda-filters-preset)
86298619
filter)))
86308620
(dolist (x filter)
86318621
(if (equal "-" (substring x 0 1))
@@ -8636,7 +8626,7 @@ grouptags."
86368626
((eq type 'regexp)
86378627
(setq filter
86388628
(delete-dups
8639-
(append (get 'org-agenda-regexp-filter :preset-filter)
8629+
(append (assoc-default 'regexp org-agenda-filters-preset)
86408630
filter)))
86418631
(dolist (x filter)
86428632
(if (equal "-" (substring x 0 1))
@@ -8647,7 +8637,7 @@ grouptags."
86478637
((eq type 'effort)
86488638
(setq filter
86498639
(delete-dups
8650-
(append (get 'org-agenda-effort-filter :preset-filter)
8640+
(append (assoc-default 'effort org-agenda-filters-preset)
86518641
filter)))
86528642
(dolist (x filter)
86538643
(push (org-agenda-filter-effort-form x) f))))
@@ -9340,50 +9330,50 @@ When called with a prefix argument, include all archive files as well."
93409330
(t ""))
93419331
(if (org-agenda-filter-any) " " "")
93429332
(if (or org-agenda-category-filter
9343-
(get 'org-agenda-category-filter :preset-filter))
9333+
(assoc-default 'category org-agenda-filters-preset))
93449334
'(:eval (propertize
93459335
(concat "["
93469336
(mapconcat
93479337
#'identity
93489338
(append
9349-
(get 'org-agenda-category-filter :preset-filter)
9339+
(assoc-default 'category org-agenda-filters-preset)
93509340
org-agenda-category-filter)
93519341
"")
93529342
"]")
93539343
'face 'org-agenda-filter-category
93549344
'help-echo "Category used in filtering"))
93559345
"")
93569346
(if (or org-agenda-tag-filter
9357-
(get 'org-agenda-tag-filter :preset-filter))
9347+
(assoc-default 'tag org-agenda-filters-preset))
93589348
'(:eval (propertize
93599349
(concat (mapconcat
93609350
#'identity
93619351
(append
9362-
(get 'org-agenda-tag-filter :preset-filter)
9352+
(assoc-default 'tag org-agenda-filters-preset)
93639353
org-agenda-tag-filter)
93649354
""))
93659355
'face 'org-agenda-filter-tags
93669356
'help-echo "Tags used in filtering"))
93679357
"")
93689358
(if (or org-agenda-effort-filter
9369-
(get 'org-agenda-effort-filter :preset-filter))
9359+
(assoc-default 'effort org-agenda-filters-preset))
93709360
'(:eval (propertize
93719361
(concat (mapconcat
93729362
#'identity
93739363
(append
9374-
(get 'org-agenda-effort-filter :preset-filter)
9364+
(assoc-default 'effort org-agenda-filters-preset)
93759365
org-agenda-effort-filter)
93769366
""))
93779367
'face 'org-agenda-filter-effort
93789368
'help-echo "Effort conditions used in filtering"))
93799369
"")
93809370
(if (or org-agenda-regexp-filter
9381-
(get 'org-agenda-regexp-filter :preset-filter))
9371+
(assoc-default 'regexp org-agenda-filters-preset))
93829372
'(:eval (propertize
93839373
(concat (mapconcat
93849374
(lambda (x) (concat (substring x 0 1) "/" (substring x 1) "/"))
93859375
(append
9386-
(get 'org-agenda-regexp-filter :preset-filter)
9376+
(assoc-default 'regexp org-agenda-filters-preset)
93879377
org-agenda-regexp-filter)
93889378
""))
93899379
'face 'org-agenda-filter-regexp
@@ -11235,10 +11225,10 @@ current HH:MM time."
1123511225
(,org-agenda-category-filter category)
1123611226
(,org-agenda-regexp-filter regexp)
1123711227
(,org-agenda-effort-filter effort)
11238-
(,(get 'org-agenda-tag-filter :preset-filter) tag)
11239-
(,(get 'org-agenda-category-filter :preset-filter) category)
11240-
(,(get 'org-agenda-effort-filter :preset-filter) effort)
11241-
(,(get 'org-agenda-regexp-filter :preset-filter) regexp))))
11228+
(,(assoc-default 'tag org-agenda-filters-preset) tag)
11229+
(,(assoc-default 'category org-agenda-filters-preset) category)
11230+
(,(assoc-default 'effort org-agenda-filters-preset) effort)
11231+
(,(assoc-default 'regexp org-agenda-filters-preset) regexp))))
1124211232

1124311233
(defun org-agenda-drag-line-forward (arg &optional backward)
1124411234
"Drag an agenda line forward by ARG lines.

testing/lisp/test-org-agenda.el

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,53 @@ See https://list.orgmode.org/06d301d83d9e$f8b44340$ea1cc9c0$@tomdavey.com"
196196
(org-toggle-sticky-agenda)
197197
(org-test-agenda--kill-all-agendas))
198198

199+
(ert-deftest test-org-agenda/sticky-agenda-filter-preset ()
200+
"Update sticky agenda buffers properly with preset of filters."
201+
(unless org-agenda-sticky
202+
(org-toggle-sticky-agenda))
203+
(org-test-agenda-with-agenda "* TODO Foo"
204+
(org-set-property "CATEGORY" "foo")
205+
(let ((org-agenda-custom-commands
206+
'(("f" "foo: multi-command"
207+
((tags-todo "+CATEGORY=\"foo\"")
208+
(alltodo ""))
209+
((org-agenda-category-filter-preset '("+foo"))))
210+
("b" "bar: multi-command"
211+
((tags-todo "+CATEGORY=\"bar\"")
212+
(alltodo ""))
213+
((org-agenda-category-filter-preset '("+bar"))))
214+
("f1" "foo: single-command"
215+
tags-todo "+CATEGORY=\"foo\""
216+
((org-agenda-category-filter-preset '("+foo"))))
217+
("b1" "bar: single-command"
218+
tags-todo "+CATEGORY=\"bar\""
219+
((org-agenda-category-filter-preset '("+bar"))))
220+
("f2" "foo: single-command"
221+
alltodo "" ((org-agenda-category-filter-preset '("+foo"))))
222+
("b2" "bar: single-command"
223+
alltodo "" ((org-agenda-category-filter-preset '("+bar")))))))
224+
(org-agenda nil "f")
225+
(org-agenda nil "b")
226+
(set-buffer "*Org Agenda(f)*")
227+
(org-agenda-redo)
228+
(goto-char (point-min))
229+
(should (not (invisible-p (1- (search-forward "TODO Foo")))))
230+
(org-test-agenda--kill-all-agendas)
231+
(org-agenda nil "f1")
232+
(org-agenda nil "b1")
233+
(set-buffer "*Org Agenda(f1:+CATEGORY=\"foo\")*")
234+
(org-agenda-redo)
235+
(goto-char (point-min))
236+
(should (not (invisible-p (1- (search-forward "TODO Foo")))))
237+
(org-test-agenda--kill-all-agendas)
238+
(org-agenda nil "f2")
239+
(org-agenda nil "b2")
240+
(set-buffer "*Org Agenda(f2)*")
241+
(org-agenda-redo)
242+
(goto-char (point-min))
243+
(should (not (invisible-p (1- (search-forward "TODO Foo")))))))
244+
(org-toggle-sticky-agenda))
245+
199246
(ert-deftest test-org-agenda/goto-date ()
200247
"Test `org-agenda-goto-date'."
201248
(unwind-protect
@@ -229,6 +276,19 @@ See https://list.orgmode.org/06d301d83d9e$f8b44340$ea1cc9c0$@tomdavey.com"
229276
(should (= 11 text-scale-mode-amount)))
230277
(org-test-agenda--kill-all-agendas)))
231278

279+
(ert-deftest test-org-agenda/redo-setting ()
280+
"Command settings survives `org-agenda-redo'."
281+
(org-test-agenda--kill-all-agendas)
282+
(let ((org-agenda-custom-commands
283+
'(("t" "TODOs" alltodo ""
284+
((org-agenda-overriding-header "Test"))))))
285+
(org-agenda nil "t")
286+
(org-agenda-redo)
287+
(org-agenda-redo)
288+
(goto-char (point-min))
289+
(should (looking-at-p "Test")))
290+
(org-test-agenda--kill-all-agendas))
291+
232292

233293
(ert-deftest test-org-agenda/diary-inclusion ()
234294
"Diary inclusion happens."

0 commit comments

Comments
 (0)