[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/treesit-fold d07b2bae49 065/417: Complete indicators
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/treesit-fold d07b2bae49 065/417: Complete indicators |
Date: |
Mon, 1 Jul 2024 10:02:11 -0400 (EDT) |
branch: elpa/treesit-fold
commit d07b2bae49e75d93b96a2780e33adfefef708e7c
Author: Jen-Chieh Shen <jcs090218@gmail.com>
Commit: Jen-Chieh Shen <jcs090218@gmail.com>
Complete indicators
---
tree-sitter-fold-indicators.el | 118 ++++++++++++++++++-----------------------
1 file changed, 52 insertions(+), 66 deletions(-)
diff --git a/tree-sitter-fold-indicators.el b/tree-sitter-fold-indicators.el
index 836c5c554b..0533371c2b 100644
--- a/tree-sitter-fold-indicators.el
+++ b/tree-sitter-fold-indicators.el
@@ -25,8 +25,8 @@
;;; Code:
+(require 'cl-lib)
(require 'fringe-helper)
-
(require 'tree-sitter-fold-util)
(defcustom tree-sitter-fold-indicators-fringe 'left-fringe
@@ -97,6 +97,12 @@
"........" "........" "........" "........" "........"
"........" "........" "........" "........" "........")
+;;
+;; (@* "Externals" )
+;;
+
+(defvar tree-sitter-fold-foldable-node-alist)
+
;;
;; (@* "Entry" )
;;
@@ -111,30 +117,27 @@
(defun tree-sitter-fold-indicators--enable ()
"Enable `tree-sitter-fold-indicators' mode."
(if (tree-sitter-fold-mode 1) ; Enable `tree-sitter-fold-mode' automatically
- (progn
- (add-hook 'after-change-functions
#'tree-sitter-fold-indicators--start-timer nil t)
- (add-hook 'after-save-hook #'tree-sitter-fold-indicators--start-timer
nil t))
- (origami-indicators-mode -1)))
+ (add-hook 'tree-sitter-after-change-functions
#'tree-sitter-fold-indicators--after-change nil t)
+ (tree-sitter-fold-indicators-mode -1)))
(defun tree-sitter-fold-indicators--disable ()
"Disable `tree-sitter-fold-indicators' mode."
- (remove-hook 'after-change-functions
#'tree-sitter-fold-indicators--start-timer t)
- (remove-hook 'after-save-hook #'tree-sitter-fold-indicators--start-timer t)
+ (remove-hook 'tree-sitter-after-change-functions
#'tree-sitter-fold-indicators--after-change t)
(tree-sitter-fold-indicators--remove-overlays (current-buffer)))
;;;###autoload
-(define-minor-mode origami-indicators-mode
+(define-minor-mode tree-sitter-fold-indicators-mode
"Minor mode for indicators mode."
- :group 'origami-indicators
+ :group 'tree-sitter-fold-indicators
:lighter nil
- :keymap origami-indicators-mode-map
+ :keymap tree-sitter-fold-indicators-mode-map
:init-value nil
- (if origami-indicators-mode (tree-sitter-fold-indicators--enable)
+ (if tree-sitter-fold-indicators-mode (tree-sitter-fold-indicators--enable)
(tree-sitter-fold-indicators--disable)))
;;;###autoload
-(define-global-minor-mode global-origami-indicators-mode
origami-indicators-mode
- (lambda () (origami-indicators-mode 1)))
+(define-global-minor-mode global-tree-sitter-fold-indicators-mode
tree-sitter-fold-indicators-mode
+ (lambda () (tree-sitter-fold-indicators-mode 1)))
;;
;; (@* "Events" )
@@ -163,22 +166,22 @@
;; (@* "Core" )
;;
-(defun origami-indicators--create-overlay-at-point ()
+(defun tree-sitter-fold-indicators--create-overlay-at-point ()
"Create indicator overlay at current point."
(let* ((pos (line-beginning-position))
(ov (make-overlay pos (1+ pos))))
- (overlay-put ov 'creator 'origami-indicators)
+ (overlay-put ov 'creator 'tree-sitter-fold-indicators)
ov))
-(defun origami-indicators--create-overlays (beg end)
+(defun tree-sitter-fold-indicators--create-overlays (beg end)
"Return a list of indicator overlays from BEG to END."
(let ((ov-lst '()))
(save-excursion
(goto-char beg)
(while (and (<= (line-beginning-position) end) (not (eobp)))
- (push (origami-indicators--create-overlay-at-point) ov-lst)
+ (push (tree-sitter-fold-indicators--create-overlay-at-point) ov-lst)
(forward-line 1)))
- (origami-indicators--update-overlays (reverse ov-lst) t)))
+ (tree-sitter-fold-indicators--update-overlays (reverse ov-lst) t)))
(defun tree-sitter-fold-indicators--get-priority (bitmap)
"Get priority by BITMAP."
@@ -206,85 +209,68 @@
(tree-sitter-fold-indicators-fr-end-right nil)
(t nil)))))
-(defun origami-indicators--active-ov (show ov bitmap)
+(defun tree-sitter-fold-indicators--active-ov (show ov bitmap)
"SHOW the indicator OV with BITMAP."
(when (overlayp ov)
- (overlay-put ov 'origami-indicators-active show)
+ (overlay-put ov 'tree-sitter-fold-indicators-active show)
(overlay-put ov 'type bitmap)
(overlay-put ov 'priority (tree-sitter-fold-indicators--get-priority
bitmap))
(overlay-put ov 'before-string (tree-sitter-fold-indicators--get-string
show ov bitmap))))
-(defun origami-indicators--get-end-fringe ()
+(defun tree-sitter-fold-indicators--get-end-fringe ()
"Return end fringe bitmap according to variable
`tree-sitter-fold-indicators-fringe'."
(cl-case tree-sitter-fold-indicators-fringe
- (left-fringe 'origami-indicators-fr-end-left)
- (right-fringe 'origami-indicators-fr-end-right)
+ (left-fringe 'tree-sitter-fold-indicators-fr-end-left)
+ (right-fringe 'tree-sitter-fold-indicators-fr-end-right)
(t (user-error "Invalid indicators fringe type: %s"
tree-sitter-fold-indicators-fringe))))
-(defun origami-indicators--update-overlays (ov-lst show)
+(defun tree-sitter-fold-indicators--update-overlays (ov-lst show)
"SHOW indicators overlays OV-LST."
(let* ((len (length ov-lst))
(len-1 (1- len))
(first-ov (nth 0 ov-lst))
(last-ov (nth len-1 ov-lst))
(index 1))
- (origami-indicators--active-ov
+ (tree-sitter-fold-indicators--active-ov
show first-ov
(if show
(if (> len 1)
- 'origami-indicators-fr-minus-tail 'origami-indicators-fr-minus)
- 'origami-indicators-fr-plus))
+ 'tree-sitter-fold-indicators-fr-minus-tail
'tree-sitter-fold-indicators-fr-minus)
+ 'tree-sitter-fold-indicators-fr-plus))
(when (> len 1)
- (origami-indicators--active-ov show last-ov
(origami-indicators--get-end-fringe)))
+ (tree-sitter-fold-indicators--active-ov show last-ov
(tree-sitter-fold-indicators--get-end-fringe)))
(while (< index len-1)
- (origami-indicators--active-ov show (nth index ov-lst)
'origami-indicators-fr-center)
+ (tree-sitter-fold-indicators--active-ov show (nth index ov-lst)
'tree-sitter-fold-indicators-fr-center)
(cl-incf index)))
ov-lst)
;;
-;; (@* "Timer" )
+;; (@* "Update" )
;;
-(defcustom tree-sitter-fold-indicators-time 0.5
- "Indicators refresh rate in time."
- :type 'float
- :group 'tree-sitter-fold)
-
-(defvar-local tree-sitter-fold-indicators--timer nil
- "Timer for update indicators.")
-
-(defun tree-sitter-fold-indicators--refresh (buffer &rest _)
- "Refresh indicator overlays to BUFFER."
- (when tree-sitter-fold-indicators-mode
- (tree-sitter-fold-util--with-current-buffer buffer
- (ignore-errors (call-interactively #'origami-open-node)) ; first
rebuild tree
- ;; Remove other invalid obsolete overlays
- (let ((ovs (origami-tree-overlays buffer)))
- (dolist (ov (origami-util-overlays-in 'creator 'origami))
- (unless (memq ov ovs) (delete-overlay ov))))
- ;; Remove all indicator overlays
- (remove-overlays (point-min) (point-max) 'creator 'origami-indicators)
- ;; Reapply indicator overlays
- (let ((ovs (overlays-in (point-min) (point-max))) start end tmp-ovs)
- (dolist (ov ovs)
- (when (eq 'origami (overlay-get ov 'creator))
- (setq start (overlay-start ov) end (overlay-end ov)
- tmp-ovs (overlay-get ov 'ind-ovs))
- (unless (equal start end)
- (when (listp tmp-ovs) (mapc #'delete-overlay tmp-ovs))
- (overlay-put ov 'ind-ovs (origami-indicators--create-overlays
start end)))))))))
-
-(defun tree-sitter-fold-indicators--start-timer (&rest _)
- "Start refresh timer."
- (when (timerp tree-sitter-fold-indicators--timer) (cancel-timer
tree-sitter-fold-indicators--timer))
- (setq tree-sitter-fold-indicators--timer
- (run-with-idle-timer tree-sitter-fold-indicators-time nil
- #'tree-sitter-fold-indicators--refresh
(current-buffer))))
+(defun tree-sitter-fold-indicators--create (node)
+ "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 'origami-indicators)))
+ (remove-overlays (point-min) (point-max) 'creator
'tree-sitter-fold-indicators)))
(provide 'tree-sitter-fold-indicators)
;;; tree-sitter-fold-indicators.el ends here
- [nongnu] elpa/treesit-fold c33e5e7e0c 128/417: Temporily disable csharp, (continued)
- [nongnu] elpa/treesit-fold c33e5e7e0c 128/417: Temporily disable csharp, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold 6b6f30eb4a 142/417: Add emoji, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold 6aabbc6256 147/417: Update doc, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold e6ac78f0e2 154/417: SCALE AND CENTER, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold a806886568 161/417: Update support language list, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold 2409596f33 004/417: readme: fix typo, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold 362fc74774 011/417: R: fold brace_list instead, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold f0858f1dbc 009/417: add support for R, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold b3faaaa40d 015/417: support folding nix functions, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold de5ad4b2f2 063/417: Split uitl, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold d07b2bae49 065/417: Complete indicators,
ELPA Syncer <=
- [nongnu] elpa/treesit-fold d2c13aac81 069/417: Clean compile, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold 4d4526ffb3 073/417: Update core, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold 2dfd8c1656 083/417: Add support lang, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold 5c9981872e 095/417: Restrict one, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold 2ba784bea0 093/417: Fix externals, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold f13f0c371b 102/417: Core, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold 80b8e2b6dc 138/417: Fix code block syntax, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold fe9b69359c 150/417: Correct external calls, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold 946eebf84a 151/417: Update do, ELPA Syncer, 2024/07/01
- [nongnu] elpa/treesit-fold 38cb89733b 156/417: Link indicators mode gif, ELPA Syncer, 2024/07/01