diff --git a/lisp/org-element.el b/lisp/org-element.el index e61c292d5..dbf54454a 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -6694,6 +6694,14 @@ known element in cache (it may start after END)." (before (car elements)) (after (cdr elements))) (if (not before) after + ;; If BEFORE is a keyword, it may need to be removed to become + ;; an affiliated keyword. + (when (eq 'keyword (org-element-type before)) + (let ((prev before)) + (while (eq 'keyword (org-element-type prev)) + (setq before prev + beg (org-element-property :begin prev)) + (setq prev (org-element--cache-find (1- (org-element-property :begin before))))))) (let ((up before) (robust-flag t)) (while up @@ -7288,7 +7296,8 @@ the cache." (setq start (max (or start -1) (or (org-element-property :begin data) -1) (or (org-element-property :begin (element-match-at-point)) -1)))) - (when (>= start to-pos) (cache-walk-abort))) + (when (>= start to-pos) (cache-walk-abort)) + (when (eq start -1) (setq start nil))) (cache-walk-abort)))) ;; Find expected begin position of an element after ;; DATA. diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index 3d320b83b..a4c94efe2 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -4128,6 +4128,20 @@ Text :end (org-element-property :parent (org-element-at-point))) (+ parent-end 3)))))) +(ert-deftest test-org-element/cache-affiliated () + "Test updating affiliated keywords." + ;; Inserting a line right after other keywords. + (let ((org-element-use-cache t)) + (org-test-with-temp-text " +#+caption: test +#+name: test + +line" + (org-element-cache-map #'ignore :granularity 'element) + (should (eq 'keyword (org-element-type (org-element-at-point)))) + (insert "#") + (should (eq 2 (org-element-property :begin (org-element-at-point))))))) + (ert-deftest test-org-element/cache-table () "Test handling edits in tables." ;; Unindented second row of the table should not be re-parented by