branch: elpa/treesit-fold
commit d57ff357194483f4d3277613345634136a41b509
Author: JenChieh <[email protected]>
Commit: JenChieh <[email protected]>

    feat: Add Vim support
---
 treesit-fold-parsers.el | 17 +++++++++++++----
 treesit-fold-summary.el |  5 +++++
 treesit-fold.el         | 17 ++++++++---------
 3 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/treesit-fold-parsers.el b/treesit-fold-parsers.el
index 2b0864b3217..a12734c5541 100644
--- a/treesit-fold-parsers.el
+++ b/treesit-fold-parsers.el
@@ -104,6 +104,7 @@
 (declare-function treesit-fold-range-verilog-initial-construct 
"treesit-fold.el")
 (declare-function treesit-fold-range-verilog-module "treesit-fold.el")
 (declare-function treesit-fold-range-vhdl-package "treesit-fold.el")
+(declare-function treesit-fold-range-vim-for-loop "treesit-fold.el")
 (declare-function treesit-fold-range-vhdl-type "treesit-fold.el")
 
 ;;
@@ -760,10 +761,18 @@
     (enumeration_type_definition . treesit-fold-range-seq)
     (comment                     . treesit-fold-range-lua-comment)))
 
-(defun treesit-fold-parsers-vimscript ()
-  "Rule set for Vimscript."
-  '((function_definition . treesit-fold-range-vimscript-function)
-    (if_statement        . (treesit-fold-range-seq 1 -4))))
+(defun treesit-fold-parsers-vim ()
+  "Rule set for Vim."
+  '((function_definition . treesit-fold-range-vim-for-loop)
+    (for_loop            . treesit-fold-range-vim-for-loop)
+    (while_loop          . treesit-fold-range-vim-for-loop)
+    (if_statement        . treesit-fold-range-vim-for-loop)
+    (elseif_statement    . treesit-fold-range-vim-for-loop)
+    (else_statement      . treesit-fold-range-vim-for-loop)
+    (list                . treesit-fold-range-seq)
+    (comment
+     . (lambda (node offset)
+         (treesit-fold-range-line-comment node offset "\"")))))
 
 (defun treesit-fold-parsers-xml ()
   "Rule set for XML."
diff --git a/treesit-fold-summary.el b/treesit-fold-summary.el
index 9318b240f4a..383ac12052a 100644
--- a/treesit-fold-summary.el
+++ b/treesit-fold-summary.el
@@ -178,6 +178,10 @@ type of content by checking the word boundary's existence."
   "Extract summary from DOC-STR in Org block."
   (treesit-fold-summary--doc-extract doc-str '()))
 
+(defun treesit-fold-summary-vim (doc-str)
+  "Extract summary from DOC-STR in Vim."
+  (treesit-fold-summary--generic doc-str '("\"")))
+
 (defun treesit-fold-summary-xml (doc-str)
   "Extract summary from DOC-STR in XML."
   (treesit-fold-summary--generic doc-str "-"))
@@ -279,6 +283,7 @@ type of content by checking the word boundary's existence."
     (typescript-mode        . treesit-fold-summary-javadoc)
     (verilog-mode           . treesit-fold-summary-javadoc)
     (vhdl-mode              . treesit-fold-summary-lua-doc)
+    (vimscript-ts-mode      . treesit-fold-summary-vim)
     (nxml-mode              . treesit-fold-summary-xml)
     (yaml-mode              . treesit-fold-summary-ruby-doc)
     (k8s-mode               . treesit-fold-summary-ruby-doc)
diff --git a/treesit-fold.el b/treesit-fold.el
index 57838fe4818..5a806475e24 100644
--- a/treesit-fold.el
+++ b/treesit-fold.el
@@ -197,7 +197,7 @@
     (verilog-ts-mode        . ,(treesit-fold-parsers-verilog))
     (vhdl-mode              . ,(treesit-fold-parsers-vhdl))
     (vhdl-ts-mode           . ,(treesit-fold-parsers-vhdl))
-    (vimscript-ts-mode      . ,(treesit-fold-parsers-vimscript))
+    (vimscript-ts-mode      . ,(treesit-fold-parsers-vim))
     (nxml-mode              . ,(treesit-fold-parsers-xml))
     (xml-ts-mode            . ,(treesit-fold-parsers-xml))
     (yaml-mode              . ,(treesit-fold-parsers-yaml))
@@ -1607,17 +1607,16 @@ more information."
       (setq end (treesit-fold--last-eol end)))
     (treesit-fold--cons-add (cons beg end) offset)))
 
-(defun treesit-fold-range-vimscript-function (node offset)
-  "Return the fold range for `function!' and `func' NODE
-in Vimscript.
-
+(defun treesit-fold-range-vim-for-loop (node offset)
+  "Return the fold range for `for_loop' in Vim.
 For arguments NODE and OFFSET, see function `treesit-fold-range-seq' for
 more information."
-  (when-let* ((param-node (treesit-node-child node 1))
-              (beg (treesit-node-start param-node))
+  (when-let* ((body (car (treesit-fold-find-children node "body")))
+              (prev (treesit-node-prev-sibling body))
+              (beg (treesit-node-end prev))
               (end (treesit-node-end node)))
-    (unless treesit-fold-on-next-line  ; display nicely
-      (setq beg (treesit-fold--last-eol beg)))
+    (when treesit-fold-on-next-line
+      (setq end (treesit-fold--last-eol end)))
     (treesit-fold--cons-add (cons beg end) offset)))
 
 (provide 'treesit-fold)

Reply via email to