diff --git a/lisp/org.el b/lisp/org.el index a53f36d33..b6717066c 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -7332,13 +7332,12 @@ When REMOVE is non-nil, remove the subtree from the clipboard." ((looking-at-p org-outline-regexp-bol) (org-outline-level)))) (previous-level (save-excursion - (org-previous-visible-heading 1) + (unless (org-at-heading-p) (org-previous-visible-heading 1)) (if (org-at-heading-p) (org-outline-level) 1))) (next-level (save-excursion - (if (org-at-heading-p) (org-outline-level) - (org-next-visible-heading 1) - (if (org-at-heading-p) (org-outline-level) 1)))) + (org-next-visible-heading 1) + (if (org-at-heading-p) (org-outline-level) 1))) (new-level (or force-level (max previous-level next-level))) (shift (if (or (= old-level -1) (= new-level -1) diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 8db0bcb3b..36f4d796b 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -9372,6 +9372,24 @@ CLOSED: %s (org-test-with-temp-text "* H1\n\n** H2" (org-paste-subtree nil "* Text") (buffer-string)))) + ;; When point is on heading at bol, insert before + (should + (equal "* Text\n* H1\n** H2" + (org-test-with-temp-text "* H1\n** H2" + (org-paste-subtree nil "*** Text") + (buffer-string)))) + ;; When point is on heading but not at bol, use smallest level among + ;; current heading and next, inserting before the next heading. + (should + (equal "* H1\ncontents\n** Text\n** H2" + (org-test-with-temp-text "* H1\ncontents\n** H2" + (org-paste-subtree nil "*** Text") + (buffer-string)))) + (should + (equal "*** H1\ncontents\n*** Text\n* H2" + (org-test-with-temp-text "*** H1\ncontents\n* H2" + (org-paste-subtree nil "* Text") + (buffer-string)))) ;; When on an empty heading, after the stars, deduce the new level ;; from the number of stars. (should