branch: elpa/treesit-fold
commit c6f58d41d57c17a681160f76943c47b9487a904c
Author: Jen-Chieh Shen <[email protected]>
Commit: Jen-Chieh Shen <[email protected]>
Fix
---
tree-sitter-fold-indicators.el | 62 ++++++++++++++++++++++++------------------
tree-sitter-fold.el | 10 ++++++-
2 files changed, 44 insertions(+), 28 deletions(-)
diff --git a/tree-sitter-fold-indicators.el b/tree-sitter-fold-indicators.el
index 0533371c2b..aa7fc669d3 100644
--- a/tree-sitter-fold-indicators.el
+++ b/tree-sitter-fold-indicators.el
@@ -103,6 +103,8 @@
(defvar tree-sitter-fold-foldable-node-alist)
+(declare-function tree-sitter-fold-overlay-at "tree-sitter-fold.el")
+
;;
;; (@* "Entry" )
;;
@@ -117,13 +119,16 @@
(defun tree-sitter-fold-indicators--enable ()
"Enable `tree-sitter-fold-indicators' mode."
(if (tree-sitter-fold-mode 1) ; Enable `tree-sitter-fold-mode' automatically
- (add-hook 'tree-sitter-after-change-functions
#'tree-sitter-fold-indicators--after-change nil t)
+ (progn
+ (add-hook 'tree-sitter-after-change-functions
#'tree-sitter-fold-indicators-refresh nil t)
+ (add-hook 'after-save-hook #'tree-sitter-fold-indicators-refresh nil
t))
(tree-sitter-fold-indicators-mode -1)))
(defun tree-sitter-fold-indicators--disable ()
"Disable `tree-sitter-fold-indicators' mode."
- (remove-hook 'tree-sitter-after-change-functions
#'tree-sitter-fold-indicators--after-change t)
- (tree-sitter-fold-indicators--remove-overlays (current-buffer)))
+ (remove-hook 'tree-sitter-after-change-functions
#'tree-sitter-fold-indicators-refresh t)
+ (remove-hook 'after-save-hook #'tree-sitter-fold-indicators-refresh t)
+ (tree-sitter-fold-indicators--remove-overlays))
;;;###autoload
(define-minor-mode tree-sitter-fold-indicators-mode
@@ -173,15 +178,17 @@
(overlay-put ov 'creator 'tree-sitter-fold-indicators)
ov))
-(defun tree-sitter-fold-indicators--create-overlays (beg end)
+(defun tree-sitter-fold-indicators--create-overlays (node beg end)
"Return a list of indicator overlays from BEG to END."
- (let ((ov-lst '()))
+ (let (ov-lst)
(save-excursion
(goto-char beg)
(while (and (<= (line-beginning-position) end) (not (eobp)))
(push (tree-sitter-fold-indicators--create-overlay-at-point) ov-lst)
(forward-line 1)))
- (tree-sitter-fold-indicators--update-overlays (reverse ov-lst) t)))
+ (tree-sitter-fold-indicators--update-overlays
+ (reverse ov-lst)
+ (not (tree-sitter-fold-overlay-at node)))))
(defun tree-sitter-fold-indicators--get-priority (bitmap)
"Get priority by BITMAP."
@@ -234,8 +241,8 @@
(tree-sitter-fold-indicators--active-ov
show first-ov
(if show
- (if (> len 1)
- 'tree-sitter-fold-indicators-fr-minus-tail
'tree-sitter-fold-indicators-fr-minus)
+ (if (> len 1) 'tree-sitter-fold-indicators-fr-minus-tail
+ 'tree-sitter-fold-indicators-fr-minus)
'tree-sitter-fold-indicators-fr-plus))
(when (> len 1)
(tree-sitter-fold-indicators--active-ov show last-ov
(tree-sitter-fold-indicators--get-end-fringe)))
@@ -252,25 +259,26 @@
"Create indicators with NODE."
(let ((beg (tsc-node-start-position node))
(end (tsc-node-end-position node)))
- (tree-sitter-fold-indicators--create-overlays beg end)))
-
-(defun tree-sitter-fold-indicators--after-change (&rest _)
- "Register to hook `tree-sitter-after-change-functions'."
- (tree-sitter-fold--ensure-ts
- (let* ((node (tsc-root-node tree-sitter-tree))
- (patterns (seq-mapcat (lambda (type) `(,(list type) @name))
- (alist-get major-mode
tree-sitter-fold-foldable-node-alist)
- 'vector))
- (query (tsc-make-query tree-sitter-language patterns))
- (nodes-to-fold (tsc-query-captures query node #'ignore)))
- (thread-last nodes-to-fold
- (mapcar #'cdr)
- (mapc #'tree-sitter-fold-indicators--create)))))
-
-(defun tree-sitter-fold-indicators--remove-overlays (buffer)
- "Remove all indicators overlays from BUFFER."
- (with-current-buffer buffer
- (remove-overlays (point-min) (point-max) 'creator
'tree-sitter-fold-indicators)))
+ (tree-sitter-fold-indicators--create-overlays node beg end)))
+
+(defun tree-sitter-fold-indicators-refresh (&rest _)
+ "Refresh indicators for all folding range."
+ (when tree-sitter-fold-indicators-mode
+ (tree-sitter-fold--ensure-ts
+ (let* ((node (tsc-root-node tree-sitter-tree))
+ (patterns (seq-mapcat (lambda (type) `(,(list type) @name))
+ (alist-get major-mode
tree-sitter-fold-foldable-node-alist)
+ 'vector))
+ (query (tsc-make-query tree-sitter-language patterns))
+ (nodes-to-fold (tsc-query-captures query node #'ignore)))
+ (tree-sitter-fold-indicators--remove-overlays)
+ (thread-last nodes-to-fold
+ (mapcar #'cdr)
+ (mapc #'tree-sitter-fold-indicators--create))))))
+
+(defun tree-sitter-fold-indicators--remove-overlays ()
+ "Remove all indicators overlays."
+ (remove-overlays (point-min) (point-max) 'creator
'tree-sitter-fold-indicators))
(provide 'tree-sitter-fold-indicators)
;;; tree-sitter-fold-indicators.el ends here
diff --git a/tree-sitter-fold.el b/tree-sitter-fold.el
index 6bab5ab154..47c0c2896b 100644
--- a/tree-sitter-fold.el
+++ b/tree-sitter-fold.el
@@ -108,6 +108,12 @@ the fold in a cons cell. See
`tree-sitter-fold-range-python' for an example."
"Face used to display fringe contents."
:group 'tree-sitter-fold)
+;;
+;; (@* "Externals" )
+;;
+
+(declare-function tree-sitter-fold-indicators-refresh
"tree-sitter-fold-indicators.el")
+
;;
;; (@* "Entry" )
;;
@@ -179,6 +185,7 @@ This function is borrowed from `tree-sitter-node-at-point'."
"Create invisible overlay in RANGE."
(when (not (null range))
(let* ((beg (car range)) (end (cdr range)) (ov (make-overlay beg end)))
+ (overlay-put ov 'creator 'tree-sitter-fold)
(overlay-put ov 'invisible 'tree-sitter-fold)
(overlay-put ov 'display (or (and tree-sitter-fold-summary-show
(tree-sitter-fold-summary--get
(buffer-substring beg end)))
@@ -226,7 +233,8 @@ current `major-mode'. If no foldable NODE is found in
point, do nothing."
;; make sure I do not create multiple overlays for the same fold
(when-let* ((ov (tree-sitter-fold-overlay-at node)))
(delete-overlay ov))
- (tree-sitter-fold--create-overlay (tree-sitter-fold--get-fold-range
node)))))
+ (tree-sitter-fold--create-overlay (tree-sitter-fold--get-fold-range
node)))
+ (tree-sitter-fold-indicators-refresh)))
;;;###autoload
(defun tree-sitter-fold-open ()