diff --git a/lisp/ob-exp.el b/lisp/ob-exp.el index 0a8edc261..b3d6675a2 100644 --- a/lisp/ob-exp.el +++ b/lisp/ob-exp.el @@ -43,7 +43,7 @@ (declare-function org-link-search "org" (s &optional type avoid-pos stealth)) (declare-function org-fill-template "org" (template alist)) (declare-function org-split-string "org" (string &optional separators)) -(declare-function org-element-at-point "org-element" (&optional keep-trail)) +(declare-function org-element-at-point "org-element" ()) (declare-function org-element-context "org-element" ()) (declare-function org-element-property "org-element" (property element)) (declare-function org-element-type "org-element" (element)) diff --git a/lisp/org-macro.el b/lisp/org-macro.el index 61e9243b8..7e0b2b242 100644 --- a/lisp/org-macro.el +++ b/lisp/org-macro.el @@ -41,7 +41,7 @@ ;;; Code: (require 'org-macs) -(declare-function org-element-at-point "org-element" (&optional keep-trail)) +(declare-function org-element-at-point "org-element" ()) (declare-function org-element-context "org-element" (&optional element)) (declare-function org-element-property "org-element" (property element)) (declare-function org-element-type "org-element" (element)) diff --git a/lisp/org.el b/lisp/org.el index 7a4d24438..268cfb786 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -148,7 +148,7 @@ Stars are put in group 1 and the trimmed body in group 2.") (declare-function org-element--parse-objects "org-element" (beg end acc restriction)) -(declare-function org-element-at-point "org-element" (&optional keep-trail)) +(declare-function org-element-at-point "org-element" ()) (declare-function org-element-cache-reset "org-element" (&optional all)) (declare-function org-element-contents "org-element" (element)) (declare-function org-element-context "org-element" (&optional element)) @@ -23607,18 +23607,21 @@ Move to the previous element at the same level, when possible." (progn (goto-char origin) (user-error "Cannot move further up")))))) (t - (let* ((trail (org-element-at-point 'keep-trail)) - (elem (car trail)) - (prev-elem (nth 1 trail)) + (let* ((elem (org-element-at-point)) (beg (org-element-property :begin elem))) (cond ;; Move to beginning of current element if point isn't ;; there already. ((null beg) (message "No element at point")) ((/= (point) beg) (goto-char beg)) - (prev-elem (goto-char (org-element-property :begin prev-elem))) - ((org-before-first-heading-p) (goto-char (point-min))) - (t (org-back-to-heading))))))) + (t (goto-char beg) + (skip-chars-backward " \r\t\n") + (unless (bobp) + (let ((prev (org-element-at-point))) + (goto-char (org-element-property :begin prev)) + (while (and (setq prev (org-element-property :parent prev)) + (<= (org-element-property :end prev) beg)) + (goto-char (org-element-property :begin prev))))))))))) (defun org-up-element () "Move to upper element." @@ -23652,9 +23655,19 @@ Move to the previous element at the same level, when possible." "Move backward element at point." (interactive) (if (org-with-limited-levels (org-at-heading-p)) (org-move-subtree-up) - (let* ((trail (org-element-at-point 'keep-trail)) - (elem (car trail)) - (prev-elem (nth 1 trail))) + (let* ((elem (org-element-at-point)) + (prev-elem + (save-excursion + (goto-char (org-element-property :begin elem)) + (skip-chars-backward " \r\t\n") + (unless (bobp) + (let* ((beg (org-element-property :begin elem)) + (prev (org-element-at-point)) + (up prev)) + (while (and (setq up (org-element-property :parent up)) + (<= (org-element-property :end prev) beg)) + (setq prev up)) + prev))))) ;; Error out if no previous element or previous element is ;; a parent of the current one. (if (or (not prev-elem) (org-element-nested-p elem prev-elem)) diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index e533b6520..2b901dc63 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -2875,12 +2875,6 @@ Paragraph \\alpha." (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) - (org-test-with-temp-text "#+BEGIN_CENTER\nA\n#+END_CENTER\nZ" - (progn (search-forward "Z") - (mapcar 'org-element-type (org-element-at-point t)))))) ;; Parse a list within a block itself contained in a list. (should (eq 'plain-list