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 <matt@brokenwa.re>
Link: https://orgmode.org/list/Y9MKUzWWbErLFhmq@brokenwa.re
This commit is contained in:
Ihor Radchenko 2023-01-29 14:59:37 +03:00
parent c45a058928
commit c340e799f8
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
2 changed files with 30 additions and 2 deletions

View File

@ -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

View File

@ -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."