lisp/org.el (org-sort-entries): Fix sorting partially selected subtree

* lisp/org.el (org-sort-entries): Make sure that we extend sorted
region to the full subtree if it spans beyond end of region.
* testing/lisp/test-org.el (test-org/sort-entries): Add test.
This commit is contained in:
Ihor Radchenko 2023-12-17 14:55:43 +01:00
parent 67ce9386ad
commit 92fec81e2e
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
2 changed files with 35 additions and 5 deletions

View File

@ -7702,12 +7702,24 @@ function is being called interactively."
;; Find beginning and end of region to sort
(cond
((org-region-active-p)
(setq start (region-beginning)
end (region-end))
;; we will sort the region
(setq end (region-end)
;; Limit the region to full headings.
(goto-char start)
;; Move to beginning of heading.
;; If we are inside heading, move to next.
;; If we are on heading, move to its begin position.
(if (org-at-heading-p)
(forward-line 0)
(outline-next-heading))
(setq start (point))
;; Extend region end beyond the last subtree.
(goto-char end)
(org-end-of-subtree nil t)
(setq end (point)
what "region")
(goto-char (region-beginning))
(unless (org-at-heading-p) (outline-next-heading))
(setq start (point)))
(goto-char start))
((or (org-at-heading-p)
(ignore-errors (progn (org-back-to-heading) t)))
;; we will sort the children of the current headline

View File

@ -3916,7 +3916,25 @@ SCHEDULED: <2017-05-06 Sat>
(org-test-with-temp-text
"\n* B\n* A\n# Local Variables:\n# foo: t\n# End:"
(org-sort-entries nil ?a)
(buffer-string)))))
(buffer-string))))
;; Sort region
(should
(equal "
* [#A] h2
* [#B] h3
* [#C] h1
"
(org-test-with-temp-text
"
<point>* [#C] h1
* [#A] h2
* [#B] h3"
(transient-mark-mode 1)
(push-mark (point) t t)
(search-forward "h3")
(org-sort-entries nil ?p)
(buffer-string))))
)
(ert-deftest test-org/string-collate-greaterp ()
"Test `org-string-collate-greaterp' specifications."