emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org 707d3a093b 1/4: org-cycle-list-bullet: Preserve rel


From: ELPA Syncer
Subject: [elpa] externals/org 707d3a093b 1/4: org-cycle-list-bullet: Preserve relative point position
Date: Thu, 16 Jun 2022 09:02:14 -0400 (EDT)

branch: externals/org
commit 707d3a093b3ff30bd048a95c83aa8df84a253e30
Author: Ihor Radchenko <yantar92@gmail.com>
Commit: Ihor Radchenko <yantar92@gmail.com>

    org-cycle-list-bullet: Preserve relative point position
    
    * lisp/org-list.el (org-cycle-list-bullet): Keep point position
    relative to bullet beginning/end when changing the list bullet.
    
    * testing/lisp/test-org-list.el (test-org-list/cycle-bullet): Add
    tests.
    
    Fixes https://orgmode.org/list/m2wndjfi32.fsf@gmail.com
---
 lisp/org-list.el              | 28 ++++++++++++++++++++++--
 testing/lisp/test-org-list.el | 50 ++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 75 insertions(+), 3 deletions(-)

diff --git a/lisp/org-list.el b/lisp/org-list.el
index 872436fd6c..55fb7d18ee 100644
--- a/lisp/org-list.el
+++ b/lisp/org-list.el
@@ -2327,12 +2327,19 @@ is an integer, 0 means `-', 1 means `+' etc.  If WHICH 
is
 `previous', cycle backwards."
   (interactive "P")
   (unless (org-at-item-p) (error "Not at an item"))
-  (save-excursion
+  (let ((origin (point-marker)))
     (beginning-of-line)
     (let* ((struct (org-list-struct))
            (parents (org-list-parents-alist struct))
            (prevs (org-list-prevs-alist struct))
            (list-beg (org-list-get-first-item (point) struct prevs))
+           ;; Record relative point position to bullet beginning.
+           (origin-offset (- origin
+                             (+ (point) (org-list-get-ind (point) struct))))
+           ;; Record relative point position to bullet end.
+           (origin-offset2 (- origin
+                              (+ (point) (org-list-get-ind (point) struct)
+                                 (length (org-list-get-bullet (point) 
struct)))))
            (bullet (org-list-get-bullet list-beg struct))
           (alpha-p (org-list-use-alpha-bul-p list-beg struct prevs))
           (case-fold-search nil)
@@ -2378,7 +2385,24 @@ is an integer, 0 means `-', 1 means `+' etc.  If WHICH is
         (org-list-set-bullet list-beg struct (org-list-bullet-string new))
         (org-list-struct-fix-bul struct prevs)
         (org-list-struct-fix-ind struct parents)
-        (org-list-struct-apply-struct struct old-struct)))))
+        (org-list-struct-apply-struct struct old-struct))
+      (goto-char origin)
+      (setq struct (org-list-struct))
+      (cond
+       ((>= origin-offset2 0)
+        (beginning-of-line)
+        (move-marker origin (+ (point)
+                               (org-list-get-ind (point) struct)
+                               (length (org-list-get-bullet (point) struct))
+                               origin-offset2))
+        (goto-char origin))
+       ((>= origin-offset 0)
+        (beginning-of-line)
+        (move-marker origin (+ (point)
+                               (org-list-get-ind (point) struct)
+                               origin-offset))
+        (goto-char origin)))
+      (move-marker origin nil))))
 
 ;;;###autoload
 (define-minor-mode org-list-checkbox-radio-mode
diff --git a/testing/lisp/test-org-list.el b/testing/lisp/test-org-list.el
index d3e6fc1768..da1841e73e 100644
--- a/testing/lisp/test-org-list.el
+++ b/testing/lisp/test-org-list.el
@@ -216,7 +216,55 @@
            (let ((org-plain-list-ordered-item-terminator t)
                  (org-list-allow-alphabetical t))
              (org-cycle-list-bullet)
-             (buffer-substring (point) (line-end-position)))))))
+             (buffer-substring (point) (line-end-position))))))
+  ;; Preserve point position while cycling.
+  (org-test-with-temp-text "- this is test
+
+  - asd
+    - asd
+ <point> - this is
+* headline
+"
+    (should (= (point) 36))
+    (dotimes (_ 10)
+      (org-cycle-list-bullet)
+      (should (= 1 (- (point) (line-beginning-position))))))
+  (org-test-with-temp-text "
+- this is test
+  + asd
+    - asd
+  <point>+ this is
+* headline
+"
+    (should (= (point) 37))
+    (dotimes (_ 10)
+      (org-cycle-list-bullet)
+      (should (= 2 (- (point) (line-beginning-position))))))
+  (org-test-with-temp-text "
+- this is test
+  + asd
+    - asd
+  +<point> this is
+* headline
+"
+    (should (= (point) 38))
+    (dotimes (_ 10)
+      (org-cycle-list-bullet)
+      (should (= 3 (- (point) (line-beginning-position))))))
+  (org-test-with-temp-text "
+- this is test
+  - asd
+    - asd
+  - <point>this is
+* headline
+"
+    (should (= (point) 39))
+    (dotimes (i 5)
+      (org-cycle-list-bullet)
+      (should
+       (if (or (< i 2) (= i 4))
+           (should (= 4 (- (point) (line-beginning-position))))
+         (should (= 5 (- (point) (line-beginning-position)))))))))
 
 (ert-deftest test-org-list/indent-item ()
   "Test `org-indent-item' specifications."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]