diff --git a/lisp/org-element.el b/lisp/org-element.el index 2dade91bd..807fdb4cd 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -4781,11 +4781,18 @@ first element of current section." ;; into elements with an explicit ending, but ;; return that element instead. (and (= cend origin) - (memq type - '(center-block - drawer dynamic-block inlinetask item - plain-list property-drawer quote-block - special-block)))) + (or (memq type + '(center-block + drawer dynamic-block inlinetask + property-drawer quote-block + special-block)) + ;; Corner case: if a list ends at the + ;; end of a buffer without a final new + ;; line, return last element in last + ;; item instead. + (and (memq type '(item plain-list)) + (progn (goto-char cend) + (or (bolp) (not (eobp)))))))) (throw 'exit (if keep-trail trail element)) (setq parent element) (case type diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index 76cdfdade..ea4f64904 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -2865,6 +2865,13 @@ Paragraph \\alpha." (org-test-with-temp-text "- Para1\n- Para2\n\nPara3" (progn (forward-line 2) (org-element-type (org-element-at-point)))))) + ;; Special case: when a list ends at the end of buffer and there's + ;; no final newline, return last element in last item. + (should + (eq 'paragraph + (org-test-with-temp-text "- a" + (end-of-line) + (org-element-type (org-element-at-point))))) ;; With an optional argument, return trail. (should (equal '(paragraph center-block)