diff --git a/contrib/lisp/org-link-edit.el b/contrib/lisp/org-link-edit.el index 6fa105a8e..000dd1c2c 100644 --- a/contrib/lisp/org-link-edit.el +++ b/contrib/lisp/org-link-edit.el @@ -5,7 +5,7 @@ ;; Author: Kyle Meyer ;; URL: https://gitlab.com/kyleam/org-link-edit ;; Keywords: convenience -;; Version: 1.1.0 +;; Version: 1.1.1 ;; Package-Requires: ((cl-lib "0.5") (org "8.2.10")) ;; This program is free software; you can redistribute it and/or modify @@ -373,17 +373,18 @@ END." (progn (goto-char pt) (org-link-edit--on-link-p))) (user-error "Cannot transport next link with point on a link")) - (goto-char (car desc-bounds)) - (cl-multiple-value-bind (link-beg link-end link desc) + (goto-char (or (car desc-bounds) pt)) + (cl-multiple-value-bind (link-beg link-end link orig-desc) (org-link-edit--next-link-data previous) - (unless (or (not desc-bounds) (= (length desc) 0)) + (unless (or (not desc-bounds) (= (length orig-desc) 0)) (user-error "Link already has a description")) (delete-region link-beg link-end) (insert (org-make-link-string link - (and desc-bounds - (delete-and-extract-region (car desc-bounds) - (cdr desc-bounds)))))))) + (if desc-bounds + (delete-and-extract-region (car desc-bounds) + (cdr desc-bounds)) + orig-desc)))))) (provide 'org-link-edit) ;;; org-link-edit.el ends here diff --git a/testing/lisp/test-org-list.el b/testing/lisp/test-org-list.el index 24e483179..d583e2c3c 100644 --- a/testing/lisp/test-org-list.el +++ b/testing/lisp/test-org-list.el @@ -1012,6 +1012,74 @@ (org-toggle-item t) (buffer-string))))) +(ert-deftest test-org-list/sort () + "Test `org-sort-list'." + ;; Sort alphabetically. + (should + (equal "- abc\n- def\n- xyz\n" + (org-test-with-temp-text "- def\n- xyz\n- abc\n" + (org-sort-list nil ?a) + (buffer-string)))) + (should + (equal "- xyz\n- def\n- abc\n" + (org-test-with-temp-text "- def\n- xyz\n- abc\n" + (org-sort-list nil ?A) + (buffer-string)))) + ;; Sort numerically. + (should + (equal "- 1\n- 2\n- 10\n" + (org-test-with-temp-text "- 10\n- 1\n- 2\n" + (org-sort-list nil ?n) + (buffer-string)))) + (should + (equal "- 10\n- 2\n- 1\n" + (org-test-with-temp-text "- 10\n- 1\n- 2\n" + (org-sort-list nil ?N) + (buffer-string)))) + ;; Sort by checked status. + (should + (equal "- [ ] xyz\n- [ ] def\n- [X] abc\n" + (org-test-with-temp-text "- [X] abc\n- [ ] xyz\n- [ ] def\n" + (org-sort-list nil ?x) + (buffer-string)))) + (should + (equal "- [X] abc\n- [ ] xyz\n- [ ] def\n" + (org-test-with-temp-text "- [X] abc\n- [ ] xyz\n- [ ] def\n" + (org-sort-list nil ?X) + (buffer-string)))) + ;; Sort by time stamp. + (should + (equal "- <2017-05-08 Mon>\n- <2017-05-09 Tue>\n- <2018-05-09 Wed>\n" + (org-test-with-temp-text + "- <2018-05-09 Wed>\n- <2017-05-09 Tue>\n- <2017-05-08 Mon>\n" + (org-sort-list nil ?t) + (buffer-string)))) + (should + (equal "- <2018-05-09 Wed>\n- <2017-05-09 Tue>\n- <2017-05-08 Mon>\n" + (org-test-with-temp-text + "- <2018-05-09 Wed>\n- <2017-05-09 Tue>\n- <2017-05-08 Mon>\n" + (org-sort-list nil ?T) + (buffer-string)))) + ;; Sort by custom function. + (should + (equal "- b\n- aa\n- ccc\n" + (org-test-with-temp-text "- ccc\n- b\n- aa\n" + (org-sort-list nil ?f + (lambda () + (length (buffer-substring (point-at-bol) + (point-at-eol)))) + #'<) + (buffer-string)))) + (should + (equal "- ccc\n- aa\n- b\n" + (org-test-with-temp-text "- ccc\n- b\n- aa\n" + (org-sort-list nil ?F + (lambda () + (length (buffer-substring (point-at-bol) + (point-at-eol)))) + #'<) + (buffer-string))))) + ;;; Radio Lists diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 6b151384f..d2576ebc9 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -2598,6 +2598,202 @@ http://article.gmane.org/gmane.emacs.orgmode/21459/" (org-test-with-temp-text "xx abc xx" (org-in-regexp "abc" nil t)))) +(ert-deftest test-org/sort-entries () + "Test `org-sort-entries'." + ;; Sort alphabetically. + (should + (equal "\n* abc\n* def\n* xyz\n" + (org-test-with-temp-text "\n* def\n* xyz\n* abc\n" + (org-sort-entries nil ?a) + (buffer-string)))) + (should + (equal "\n* xyz\n* def\n* abc\n" + (org-test-with-temp-text "\n* def\n* xyz\n* abc\n" + (org-sort-entries nil ?A) + (buffer-string)))) + ;; Sort numerically. + (should + (equal "\n* 1\n* 2\n* 10\n" + (org-test-with-temp-text "\n* 10\n* 1\n* 2\n" + (org-sort-entries nil ?n) + (buffer-string)))) + (should + (equal "\n* 10\n* 2\n* 1\n" + (org-test-with-temp-text "\n* 10\n* 1\n* 2\n" + (org-sort-entries nil ?N) + (buffer-string)))) + ;; Sort by custom function. + (should + (equal "\n* b\n* aa\n* ccc\n" + (org-test-with-temp-text "\n* ccc\n* b\n* aa\n" + (org-sort-entries nil ?f + (lambda () + (length (buffer-substring (point-at-bol) + (point-at-eol)))) + #'<) + (buffer-string)))) + (should + (equal "\n* ccc\n* aa\n* b\n" + (org-test-with-temp-text "\n* ccc\n* b\n* aa\n" + (org-sort-entries nil ?F + (lambda () + (length (buffer-substring (point-at-bol) + (point-at-eol)))) + #'<) + (buffer-string)))) + ;; Sort by TODO keyword. + (should + (equal "\n* TODO h1\n* TODO h3\n* DONE h2\n" + (org-test-with-temp-text + "\n* TODO h1\n* DONE h2\n* TODO h3\n" + (org-sort-entries nil ?o) + (buffer-string)))) + (should + (equal "\n* DONE h2\n* TODO h1\n* TODO h3\n" + (org-test-with-temp-text + "\n* TODO h1\n* DONE h2\n* TODO h3\n" + (org-sort-entries nil ?O) + (buffer-string)))) + ;; Sort by priority. + (should + (equal "\n* [#A] h2\n* [#B] h3\n* [#C] h1\n" + (org-test-with-temp-text + "\n* [#C] h1\n* [#A] h2\n* [#B] h3\n" + (org-sort-entries nil ?p) + (buffer-string)))) + (should + (equal "\n* [#C] h1\n* [#B] h3\n* [#A] h2\n" + (org-test-with-temp-text + "\n* [#C] h1\n* [#A] h2\n* [#B] h3\n" + (org-sort-entries nil ?P) + (buffer-string)))) + ;; Sort by creation time. + (should + (equal " +* h3 + [2017-05-08 Mon] +* h2 + [2017-05-09 Tue] +* h1 + [2018-05-09 Wed] +" + (org-test-with-temp-text + " +* h1 + [2018-05-09 Wed] +* h2 + [2017-05-09 Tue] +* h3 + [2017-05-08 Mon] +" + (org-sort-entries nil ?c) + (buffer-string)))) + + ;; Sort by scheduled date. + (should + (equal " +* TODO h4 +SCHEDULED: <2017-05-06 Sat> +* TODO h3 +SCHEDULED: <2017-05-08 Mon> +* TODO h2 +DEADLINE: <2017-05-09 Tue> +* TODO h1 +DEADLINE: <2017-05-07 Sun> +" + (org-test-with-temp-text + " +* TODO h2 +DEADLINE: <2017-05-09 Tue> +* TODO h1 +DEADLINE: <2017-05-07 Sun> +* TODO h3 +SCHEDULED: <2017-05-08 Mon> +* TODO h4 +SCHEDULED: <2017-05-06 Sat> +" + (org-sort-entries nil ?s) + (buffer-string)))) + ;; Sort by deadline date. + (should + (equal " +* TODO h1 +DEADLINE: <2017-05-07 Sun> +* TODO h2 +DEADLINE: <2017-05-09 Tue> +* TODO h3 +SCHEDULED: <2017-05-08 Mon> +* TODO h4 +SCHEDULED: <2017-05-06 Sat> +" + (org-test-with-temp-text + " +* TODO h2 +DEADLINE: <2017-05-09 Tue> +* TODO h1 +DEADLINE: <2017-05-07 Sun> +* TODO h3 +SCHEDULED: <2017-05-08 Mon> +* TODO h4 +SCHEDULED: <2017-05-06 Sat> +" + (org-sort-entries nil ?d) + (buffer-string)))) + ;; Sort by any date/time + (should + (equal " +* TODO h4 +SCHEDULED: <2017-05-06 Sat> +* TODO h1 +DEADLINE: <2017-05-07 Sun> +* TODO h3 +SCHEDULED: <2017-05-08 Mon> +* TODO h2 +DEADLINE: <2017-05-09 Tue> +" + (org-test-with-temp-text + " +* TODO h2 +DEADLINE: <2017-05-09 Tue> +* TODO h1 +DEADLINE: <2017-05-07 Sun> +* TODO h3 +SCHEDULED: <2017-05-08 Mon> +* TODO h4 +SCHEDULED: <2017-05-06 Sat> +" + (org-sort-entries nil ?t) + (buffer-string)))) + ;; Sort by clocking time. + (should + (equal " +* clocked h2 + :LOGBOOK: + CLOCK: [2017-05-09 Tue 00:15]--[2017-05-09 Tue 00:22] => 0:07 + CLOCK: [2017-05-09 Tue 00:00]--[2017-05-09 Tue 00:10] => 0:10 + :END: +* clocked h1 + :LOGBOOK: + CLOCK: [2017-05-09 Tue 00:15]--[2017-05-09 Tue 00:22] => 0:07 + CLOCK: [2017-05-09 Tue 00:00]--[2017-05-09 Tue 00:12] => 0:12 + :END: +" + (org-test-with-temp-text + " +* clocked h1 + :LOGBOOK: + CLOCK: [2017-05-09 Tue 00:15]--[2017-05-09 Tue 00:22] => 0:07 + CLOCK: [2017-05-09 Tue 00:00]--[2017-05-09 Tue 00:12] => 0:12 + :END: +* clocked h2 + :LOGBOOK: + CLOCK: [2017-05-09 Tue 00:15]--[2017-05-09 Tue 00:22] => 0:07 + CLOCK: [2017-05-09 Tue 00:00]--[2017-05-09 Tue 00:10] => 0:10 + :END: +" + (org-sort-entries nil ?k) + (buffer-string))))) + ;;; Navigation