From c340e799f8016823e960cf4b9282dad69ca3b944 Mon Sep 17 00:00:00 2001 From: Ihor Radchenko Date: Sun, 29 Jan 2023 14:59:37 +0300 Subject: [PATCH] org-element-cache-map: Always continue after point set by FUNC * lisp/org-element.el (org-element-cache-map): Never map over element starting before the point manually moved (or set via `org-element-cache-map-continue-from') by FUNC. * testing/lisp/test-org.el (test-org/map-entries): Add tests. Reported-by: Matthieu Caneill Link: https://orgmode.org/list/Y9MKUzWWbErLFhmq@brokenwa.re --- lisp/org-element.el | 10 +++++++++- testing/lisp/test-org.el | 22 +++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index 389acf825..ab28811ce 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -7697,7 +7697,15 @@ the cache." (when org-element-cache-map-continue-from (goto-char org-element-cache-map-continue-from)) (when (> (point) start) - (move-start-to-next-match nil)) + (move-start-to-next-match nil) + ;; (point) inside matching element. + ;; Go further. + (when (> (point) start) + (setq data (element-match-at-point)) + (if (not data) + (cache-walk-abort) + (goto-char (next-element-start)) + (move-start-to-next-match next-element-re)))) ;; Drop nil. (unless (car result) (pop result))) ;; If FUNC did not move the point and we diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index f999189aa..09801b5d3 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -2740,7 +2740,27 @@ SCHEDULED: <2014-03-04 tue.>" (setq org-map-continue-from (org-element-property :begin (org-element-at-point)))))) - (buffer-string))))) + (buffer-string)))) + (should + (= 1 + (org-test-with-temp-text "* H1\n** H1.1\n** H1.2\n" + (let (acc) + (org-map-entries + (lambda () + (push (org-element-property :title (org-element-at-point)) acc) + (setq org-map-continue-from + (org-element-property :end (org-element-at-point))))) + (length acc))))) + (should + (= 2 + (org-test-with-temp-text "* H1\n** H1.1\n** H1.2\n" + (let (acc) + (org-map-entries + (lambda () + (push (org-element-property :title (org-element-at-point)) acc) + (setq org-map-continue-from + (line-end-position 2)))) + (length acc)))))) (ert-deftest test-org/edit-headline () "Test `org-edit-headline' specifications."