org-paste-subtree: Fix pasting when point is on heading but not at bol

* lisp/org.el (org-paste-subtree): When point is on heading, but not
at bol, paste using heading level minimal between current heading
level and next visible heading level.
* testing/lisp/test-org.el (test-org/paste-subtree): Add test cases.

Reported-by: Philipp Kiefer <phil.kiefer@gmail.com>
Link: https://orgmode.org/list/878rhxtszb.fsf@localhost
This commit is contained in:
Ihor Radchenko 2024-04-19 14:11:15 +03:00
parent 1ae978f940
commit d73688faa4
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
2 changed files with 21 additions and 4 deletions

View File

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

View File

@ -9372,6 +9372,24 @@ CLOSED: %s
(org-test-with-temp-text "* H1\n<point>\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 "<point>* 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<point>\ncontents\n** H2"
(org-paste-subtree nil "*** Text")
(buffer-string))))
(should
(equal "*** H1\ncontents\n*** Text\n* H2"
(org-test-with-temp-text "*** H1<point>\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