branch: elpa/typst-ts-mode
commit 1c2b4bd6d9ce60bea8668a83cde687d788d1293f
Author: Meow King <[email protected]>
Commit: Meow King <[email protected]>
feat: toggle indentation for list(item)
`typst-ts-mode-cycle` and more specific control for list with the following
style:
- list \
| <- insert point will be here
---
README.md | 1 +
typst-ts-mode.el | 84 ++++++++++++++++++++++++++++++++++++++++++++++++--------
2 files changed, 73 insertions(+), 12 deletions(-)
diff --git a/README.md b/README.md
index 053688c5e0..c472bd24ed 100644
--- a/README.md
+++ b/README.md
@@ -83,6 +83,7 @@ For reference, this is my configuration.
`M-<right>` : `typst-ts-mode-heading-increase`
`M-<up>` : `typst-ts-mode-heading-up`
`M-<down>` : `typst-ts-mode-heading-down`
+`TAB` : `typst-ts-mode-cycle`
*NOTE*: `outline-minor-mode` is enabled by `typst-ts-mode`, so you can use
comamnd
defined by `outline-minor-mode` such as `outline-cycle`.
diff --git a/typst-ts-mode.el b/typst-ts-mode.el
index 1b6ca0c1ce..444e97087b 100644
--- a/typst-ts-mode.el
+++ b/typst-ts-mode.el
@@ -525,19 +525,27 @@ TYPES."
;; previous line is item type and the ending is a linebreak
((and no-node
(lambda (_node _parent bol)
- (when-let* (((not (eq bol (point-min))))
- (prev-line-node (treesit-node-at (- bol 2)))
- (prev-line-heading-node
+ (when-let* ((prev-nonwhite-pos (save-excursion
+ (goto-char bol)
+ (skip-chars-backward " \r\n\t")
+ (1- (point))))
+ ((not (eq
+ (line-number-at-pos prev-nonwhite-pos)
+ (line-number-at-pos (point)))))
+ (prev-nonwhite-line-node
+ (treesit-node-at prev-nonwhite-pos))
+ (prev-nonwhite-line-heading-node
(save-excursion
- (previous-logical-line)
+ (goto-char prev-nonwhite-pos)
(back-to-indentation)
(treesit-node-at (point))))
- (prev-line-top-node (treesit-node-parent
- prev-line-heading-node)))
+
+ (prev-nonwhite-line-top-node (treesit-node-parent
+
prev-nonwhite-line-heading-node)))
(and
- (equal (treesit-node-type prev-line-top-node) "item")
- (equal (treesit-node-type prev-line-heading-node) "-")
- (equal (treesit-node-type prev-line-node) "linebreak")))))
+ (equal (treesit-node-type prev-nonwhite-line-top-node) "item")
+ (equal (treesit-node-type prev-nonwhite-line-heading-node) "-")
+ (equal (treesit-node-type prev-nonwhite-line-node)
"linebreak")))))
parent-bol typst-ts-mode-indent-offset)
((and no-node
@@ -545,9 +553,7 @@ TYPES."
,(typst-ts-mode--ancestor-bol typst-ts-mode--bracket-node-types)
typst-ts-mode-indent-offset)
- ((and no-node
- (not ,(typst-ts-mode--ancestor-in
typst-ts-mode--bracket-node-types)))
- parent-bol 0)))
+ (no-node parent-bol 0)))
"Tree-sitter indent rules for `rust-ts-mode'.")
(defun typst-ts-mode-comment-setup()
@@ -829,6 +835,59 @@ PROC: process; OUTPUT: new output from PROC."
(setq-local compilation-error-regexp-alist nil)
(add-to-list 'compilation-error-regexp-alist 'typst-error))
+(defun typst-ts-mode-column-at-pos (pos)
+ (save-excursion
+ (goto-char pos)
+ (current-column)))
+
+;;;###autoload
+(defun typst-ts-mode-cycle (&optional arg)
+ "Cycle.
+ARG.
+TODO lack of documentation."
+ (interactive "P")
+ (let* ((cur-pos (point))
+ (cur-node (treesit-node-at cur-pos))
+ (cur-node-type (treesit-node-type cur-node)))
+ (cond
+ ((equal cur-node-type "parbreak")
+ (when-let* ((cur-line-bol
+ (save-excursion
+ (back-to-indentation)
+ (point)))
+ (prev-nonwhite-pos (save-excursion
+ (goto-char cur-line-bol)
+ (skip-chars-backward " \r\n\t")
+ (1- (point))))
+ ((not (eq
+ (line-number-at-pos prev-nonwhite-pos)
+ (line-number-at-pos (point)))))
+ (prev-nonwhite-line-node
+ (treesit-node-at prev-nonwhite-pos))
+ (prev-nonwhite-line-bol
+ (save-excursion
+ (goto-char prev-nonwhite-pos)
+ (back-to-indentation)
+ (point)))
+ (prev-nonwhite-line-heading-node
+ (treesit-node-at prev-nonwhite-line-bol))
+ (prev-nonwhite-line-top-node (treesit-node-parent
+
prev-nonwhite-line-heading-node))
+ (cur-line-bol-column (typst-ts-mode-column-at-pos
cur-line-bol))
+ (prev-nonwhite-line-bol-column
+ (typst-ts-mode-column-at-pos prev-nonwhite-line-bol)))
+ (cond
+ ((and
+ (equal (treesit-node-type prev-nonwhite-line-top-node) "item")
+ (equal (treesit-node-type prev-nonwhite-line-heading-node) "-")
+ (not (equal (treesit-node-type prev-nonwhite-line-node)
"linebreak")))
+ (if (not (eq cur-line-bol-column prev-nonwhite-line-bol-column))
+ (indent-line-to prev-nonwhite-line-bol-column)
+ (indent-line-to (+ typst-ts-mode-indent-offset
prev-nonwhite-line-bol-column)))))))
+ (t
+ (indent-for-tab-command))
+ )))
+
;;;###autoload
(defvar typst-ts-mode-map
(let ((map (make-sparse-keymap)))
@@ -840,6 +899,7 @@ PROC: process; OUTPUT: new output from PROC."
(define-key map (kbd "M-<right>") #'typst-ts-mode-heading-increase)
(define-key map (kbd "M-<down>") #'typst-ts-mode-heading-down)
(define-key map (kbd "M-<up>") #'typst-ts-mode-heading-up)
+ (define-key map (kbd "TAB") #'typst-ts-mode-cycle)
map))
;;;###autoload