branch: elpa/typst-ts-mode
commit 73f6273b132bd22b5ae2207cefcca95e4ebea89d
Author: huanie <nguyenthieuh...@gmail.com>
Commit: Ziqi Yang <mr.ziqiy...@gmail.com>

    feat: Incrase/Decrase heading level.
---
 typst-ts-mode.el | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)

diff --git a/typst-ts-mode.el b/typst-ts-mode.el
index 71b8c88d2a..ad05a4da54 100644
--- a/typst-ts-mode.el
+++ b/typst-ts-mode.el
@@ -567,6 +567,65 @@ buffer before compilation."
       (remove-hook 'compilation-finish-functions
                    (typst-ts-mode-compile--compilation-finish-function 
cur-buffer)))))
 
+(defun typst-ts-mode-meta--dwim (right-p)
+  "Either increase/decrease heading level or move by word.
+RIGHT-P non-nil for increasing heading level, RIGHT-P nil for decreasing."
+  (let ((node nil)
+       (tmp nil))
+    (setq node
+         ;; = header
+         (cond
+          ((string=
+            (treesit-node-type
+             (setq tmp (treesit-node-parent
+                        (treesit-node-at (point)))))
+            "heading")
+           (treesit-node-child tmp 0))
+          ;; = header with point at the end of line
+          ((string=
+            (treesit-node-type
+             (setq tmp (treesit-node-parent
+                        (treesit-node-at (line-beginning-position)))))
+            "heading")
+           (treesit-node-child tmp 0))
+          (t nil)))
+    (if node
+       (typst-ts-mode-shift--heading right-p node)
+      (execute-kbd-macro
+       (if right-p
+          (read-kbd-macro "M-<right>")
+        (read-kbd-macro "M-<left>"))))))
+
+(defun typst-ts-mode-shift--heading (right-p node)
+  "Increase or decrease the heading level.
+RIGHT-P nil means increase the level while RIGHT-P non-nil means decrease.
+NODE is the heading node.
+This does not handle #heading function."
+  (let* ((heading-string "")
+        (heading-level 0))
+    (setq heading-level
+         (length (setq heading-string (treesit-node-text node))))
+    (when (and (= heading-level 1) (not right-p))
+      (user-error "Cannot decrease level 1 heading"))
+    (save-excursion (replace-string-in-region heading-string
+                                             (if right-p
+                                                 (concat heading-string "=")
+                                                 (substring-no-properties 
heading-string 1 heading-level))
+                                             (treesit-node-start node)
+                                             (treesit-node-end node)))))
+;;;###autoload
+(defun typst-ts-mode-shift-heading-right ()
+  "Increase the heading level."
+  (interactive)
+  (typst-ts-mode-meta--dwim t))
+  
+;;;###autoload
+(defun typst-ts-mode-shift-heading-left ()
+  "Decrease heading level."
+  (interactive)
+  (typst-ts-mode-meta--dwim nil))
+
+
 ;;;###autoload
 (defun typst-ts-mode-compile ()
   "Compile current typst file."
@@ -731,6 +790,8 @@ PROC: process; OUTPUT: new output from PROC."
     (define-key map (kbd "C-c C-c C") #'typst-ts-mode-compile)
     (define-key map (kbd "C-c C-c w") #'typst-ts-mode-watch-toggle)
     (define-key map (kbd "C-c C-c p") #'typst-ts-mode-preview)
+    (define-key map (kbd "M-<left>") #'typst-ts-mode-shift-heading-left)
+    (define-key map (kbd "M-<right>") #'typst-ts-mode-shift-heading-right)
     map))
 
 ;;;###autoload

Reply via email to