* [PATCH] org-element-cache-map: Fix handling of continue-from
@ 2023-01-26 23:18 Matthieu Caneill
2023-01-30 9:07 ` Ihor Radchenko
0 siblings, 1 reply; 2+ messages in thread
From: Matthieu Caneill @ 2023-01-26 23:18 UTC (permalink / raw)
To: emacs-orgmode
[-- Attachment #1.1: Type: text/plain, Size: 1409 bytes --]
Hi,
I'm hit by the following bug in `org-element-cache-map'. When I use
`tags' or `tags-todo' in an agenda, with the option
`(org-tags-match-list-sublevels nil)', all sub-elements of a matching
item are correctly skipped except the last one.
It can be reproduced with the following org file:
* TODO Parent
** TODO Child 1
** TODO Child 2
and the following agenda:
(setq org-agenda-custom-commands
'(
("t" "Test"
(
(tags-todo "-foo" ((org-tags-match-list-sublevels nil)))
(tags "-foo" ((org-tags-match-list-sublevels nil)))
)
((org-agenda-files '("~/org/test.org"))))))
With `(org-tags-match-list-sublevels t)', I correctly see all 3
elements. With `(org-tags-match-list-sublevels nil)', I see Parent and
Child 2. This wasn't the case on an older version of org-element that
didn't make use of the cache.
I understand the option `org-tags-match-list-sublevels' is
semi-deprecated in favor of proper tag inheritance
configuration. However, to the best of my understanding, I can't
accomplish "list all todo items except those tagged with foo, and skip
children of matching entries" with tag inheritance.
Patch is attached. Happy to iterate over it in case my understanding
of this rather complex function is flawed. I tested it on my org
files, and would of course appreciate if others could test.
Best,
--
Matthieu
[-- Attachment #1.2: 0001-org-element-cache-map-Fix-handling-of-continue-from.patch --]
[-- Type: text/x-diff, Size: 2988 bytes --]
From 5d0e2beb9c8b8a239c41dab2f3b44d1fe83bff0c Mon Sep 17 00:00:00 2001
From: Matthieu Caneill <matt@brokenwa.re>
Date: Thu, 26 Jan 2023 23:51:05 +0100
Subject: [PATCH] org-element-cache-map: Fix handling of continue-from
* lisp/org-element.el (org-element-cache-map): When the receiving
function sets `org-element-cache-map-continue-from', value of START
should be set accordingly.
* lisp/org.el (org-scan-tags): Reset `org-map-continue-from' for every
iteration, and set it to the end of the element when sub-elements
should be skipped following `org-tags-match-list-sublevels'.
TINYCHANGE
---
lisp/org-element.el | 3 ++-
lisp/org.el | 5 +++--
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/lisp/org-element.el b/lisp/org-element.el
index a3d909290..0a1d31bee 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -7700,7 +7700,8 @@ the cache."
;; If FUNC moved point forward, update
;; START.
(when org-element-cache-map-continue-from
- (goto-char org-element-cache-map-continue-from))
+ (goto-char org-element-cache-map-continue-from)
+ (setq start org-element-cache-map-continue-from))
(when (> (point) start)
(move-start-to-next-match nil))
;; Drop nil.
diff --git a/lisp/org.el b/lisp/org.el
index ac2acfefb..dc9b7da7f 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -11010,6 +11010,7 @@ headlines matching this string."
org-outline-regexp))))
(org-element-cache-map
(lambda (el)
+ (setq org-map-continue-from nil)
(goto-char (org-element-property :begin el))
(setq todo (org-element-property :todo-keyword el)
level (org-element-property :level el)
@@ -11084,7 +11085,6 @@ headlines matching this string."
'type (concat "tagsmatch" ts-date-type))
(push txt rtn))
((functionp action)
- (setq org-map-continue-from nil)
(save-excursion
(setq rtn1 (funcall action))
(push rtn1 rtn)))
@@ -11092,7 +11092,8 @@ headlines matching this string."
;; if we are to skip sublevels, jump to end of subtree
(unless org-tags-match-list-sublevels
- (goto-char (1- (org-element-property :end el))))))
+ (goto-char (1- (org-element-property :end el)))
+ (setq org-map-continue-from (org-element-property :end el)))))
;; Get the correct position from where to continue
(when org-map-continue-from
(setq org-element-cache-map-continue-from org-map-continue-from)
--
2.30.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] org-element-cache-map: Fix handling of continue-from
2023-01-26 23:18 [PATCH] org-element-cache-map: Fix handling of continue-from Matthieu Caneill
@ 2023-01-30 9:07 ` Ihor Radchenko
0 siblings, 0 replies; 2+ messages in thread
From: Ihor Radchenko @ 2023-01-30 9:07 UTC (permalink / raw)
To: Matthieu Caneill; +Cc: emacs-orgmode
Matthieu Caneill <matt@brokenwa.re> writes:
> I'm hit by the following bug in `org-element-cache-map'. When I use
> `tags' or `tags-todo' in an agenda, with the option
> `(org-tags-match-list-sublevels nil)', all sub-elements of a matching
> item are correctly skipped except the last one.
>
> It can be reproduced with the following org file:
> ...
Thanks for reporting!
Fixed, on bugfix. Now, also covered by tests.
https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=c340e799f
--
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-01-30 9:08 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-01-26 23:18 [PATCH] org-element-cache-map: Fix handling of continue-from Matthieu Caneill
2023-01-30 9:07 ` Ihor Radchenko
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.