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)