branch: elpa/typst-ts-mode
commit 8e1c930f0f841daafac3fd9250e09b7798d098f5
Author: meowking <mr.meowk...@tutamail.com>
Commit: meowking <mr.meowk...@tutamail.com>

    fix: typst-ts-mode-cycle all descendant nodes (doing)
---
 typst-ts-core.el    | 17 +++++++++++++++++
 typst-ts-editing.el | 48 ++++++++++++++++++++++++++++++++++--------------
 2 files changed, 51 insertions(+), 14 deletions(-)

diff --git a/typst-ts-core.el b/typst-ts-core.el
index fab4ba780f..52ae4108fe 100644
--- a/typst-ts-core.el
+++ b/typst-ts-core.el
@@ -45,6 +45,14 @@
     (back-to-indentation)
     (point)))
 
+(defun typst-ts-core-line-bol-pos (&optional pos)
+  "POS."
+  (save-excursion
+    (when pos
+      (goto-char pos))
+    (back-to-indentation)
+    (point)))
+
 (defun typst-ts-core-get-node-at-bol-nonwhite (&optional pos)
   "Get node at the first non-whitespace character at line beginning.
 If POS is given, operate on the line that POS locates at."
@@ -60,6 +68,15 @@ POS.  May return nil."
   (treesit-node-parent
    (typst-ts-core-get-node-at-bol-nonwhite pos)))
 
+(defun typst-ts-core-for-lines-covered-by-node (node fn)
+  (let ((ns (treesit-node-start node))
+        (ne (treesit-node-end node)))
+    (save-excursion
+      (goto-char ns)
+      (while (and (< (point) ne) (not (eobp)))
+        (funcall fn)
+        (forward-line 1)))))
+
 (defun typst-ts-core-node-get (node instructions)
   "Get things from NODE by INSTRUCTIONS.
 It's a copy of Emacs 30's `treesit-node-get' function."
diff --git a/typst-ts-editing.el b/typst-ts-editing.el
index 7412a8213a..6f463c21eb 100644
--- a/typst-ts-editing.el
+++ b/typst-ts-editing.el
@@ -261,8 +261,9 @@ When there is no section it will insert a heading below 
point."
                         (treesit-node-parent
                          (treesit-node-at prev-nonwhite-line-bol)))
                        (cur-line-bol-column (typst-ts-core-column-at-pos 
cur-line-bol))
-                       (prev-nonwhite-line-bol-column
-                        (typst-ts-core-column-at-pos prev-nonwhite-line-bol)))
+                       (prev-nonwhite-line-top-node-start-column
+                        (typst-ts-core-column-at-pos
+                         (treesit-node-start prev-nonwhite-line-top-node))))
              (cond
               ;; 1. el
               ;; 2. psy| <- can toggle indent
@@ -270,18 +271,37 @@ When there is no section it will insert a heading below 
point."
                 (equal (treesit-node-type prev-nonwhite-line-top-node) "item")
                 ;; previous nonwhite-line ending is not '\' character
                 (not (equal (treesit-node-type prev-nonwhite-line-node) 
"linebreak")))
-               ;; TODO cycle all its children
-               (let (point)
-                 (if (not (eq cur-line-bol-column 
prev-nonwhite-line-bol-column))
-                     (progn
-                       (setq point (point))
-                       (indent-line-to prev-nonwhite-line-bol-column)
-                       (goto-char (- point typst-ts-mode-indent-offset)))
-                   (setq point (point))
-                   (indent-line-to (+ typst-ts-mode-indent-offset
-                                      prev-nonwhite-line-bol-column))
-                   (goto-char (+ typst-ts-mode-indent-offset point)))
-                 (throw 'execute-result 'success))))))
+
+               (let* ((parent-node-start-column
+                       (typst-ts-core-column-at-pos
+                        (treesit-node-start parent-node)))
+                      (offset
+                       (- parent-node-start-column
+                          prev-nonwhite-line-top-node-start-column)))
+                 (if (= offset 0)
+                     (typst-ts-core-for-lines-covered-by-node
+                      parent-node
+                      (lambda ()
+                        (let ((pos (point)))
+                          (indent-line-to
+                           (+ (typst-ts-core-column-at-pos
+                               (typst-ts-core-line-bol-pos))
+                              typst-ts-mode-indent-offset))
+                          ;; (goto-char (+ typst-ts-mode-indent-offset point))
+                          )))
+                   (typst-ts-core-for-lines-covered-by-node
+                    parent-node
+                    (lambda ()
+                      (let ((pos (point)))
+                        (indent-line-to
+                         (max (- (typst-ts-core-column-at-pos
+                                  (typst-ts-core-line-bol-pos))
+                                 offset)
+                              0))
+                        ;; (goto-char (- pos typst-ts-mode-indent-offset))
+                        )))))
+               (throw 'execute-result 'success)
+               ))))
           (t nil)))))
     ;; execute default action if not successful
     (unless (eq execute-result 'success)

Reply via email to