diff --git a/README.md b/README.md
index fe03650..394f033 100644
--- a/README.md
+++ b/README.md
@@ -32,6 +32,7 @@ the tree-sitter syntax tree.
- [❔ Example](#-example)
- [↔ Offset](#-offset)
- [🔍 Writing new fold functions](#-writing-new-fold-functions)
+ - [🔢 Line Count Display](#-line-count-display)
- [🔌 Plugins](#-plugins)
- [⚖ Indicators Mode](#-indicators-mode)
- [💾 Installation](#-installation-1)
@@ -410,6 +411,48 @@ basic `treesit-fold-range-seq`.
(treesit-fold--cons-add (cons beg end) offset))) ; return fold range
```
+### 🔢 Line Count Display
+
+The following variables let you toggle and customize the display of the line count for folded regions.
+
+- `treesit-fold-line-count-show`
+
+ This variable controls whether or not the number of lines in a folded text region is displayed.
+
+ Type: `boolean`
+
+ Default: `nil` (line count is not shown)
+
+ If set to `t`, the number of lines in folded regions will be shown.
+
+ Example:
+ ```elisp
+ (setq treesit-fold-line-count-show t) ; Show line count in folded regions
+ ```
+
+
+
+
+- `treesit-fold-line-count-format`
+
+ This variable defines the format string used for displaying the line
+ count in folded text. The `%d` will be replaced with the actual number
+ of lines in the folded region.
+
+ Type: `string`
+
+ Default: `(concat (truncate-string-ellipsis) " %d " (truncate-string-ellipsis))`
+
+ Example:
+
+ ```elisp
+ (setq treesit-fold-line-count-format " <%d lines> ")
+ ```
+
+
+
+
+
## 🔌 Plugins
treesit-fold comes with a couple of useful little additions that can be used or
diff --git a/etc/line-count-custom.png b/etc/line-count-custom.png
new file mode 100644
index 0000000..261b3cf
Binary files /dev/null and b/etc/line-count-custom.png differ
diff --git a/etc/line-count-default.png b/etc/line-count-default.png
new file mode 100644
index 0000000..ed31036
Binary files /dev/null and b/etc/line-count-default.png differ
diff --git a/treesit-fold.el b/treesit-fold.el
index 3bd2027..7ff5494 100644
--- a/treesit-fold.el
+++ b/treesit-fold.el
@@ -249,8 +249,21 @@ For example, Lua, Ruby, etc."
"Face used to display fringe contents."
:group 'treesit-fold)
-(defvar-keymap treesit-fold-mode-map
- :doc "Keymap used when `treesit-fold-mode' is active.")
+(defcustom treesit-fold-line-count-show nil
+ "Show the number of lines in folded text."
+ :type 'boolean
+ :group 'treesit-fold)
+
+(defcustom treesit-fold-line-count-format
+ (concat (truncate-string-ellipsis)
+ " %d "
+ (truncate-string-ellipsis))
+ "Format string for displaying line count in folded text.
+
+The %d will be replaced with the number of lines in the folded region."
+ :type 'string
+ :group 'treesit-fold)
+
;;
;; (@* "Externals" )
;;
@@ -264,6 +277,9 @@ For example, Lua, Ruby, etc."
;; (@* "Entry" )
;;
+(defvar-keymap treesit-fold-mode-map
+ :doc "Keymap used when `treesit-fold-mode' is active.")
+
(defun treesit-fold--enable ()
"Start folding minor mode."
(setq-local line-move-ignore-invisible t)
@@ -388,6 +404,22 @@ This function is borrowed from `tree-sitter-node-at-point'."
;; (@* "Overlays" )
;;
+(defun treesit-fold--format-overlay-text (beg end)
+ "Return the text to display in the overlay for the fold from BEG to END."
+ (let ((summary (and treesit-fold-summary-show
+ (treesit-fold-summary--get (buffer-substring beg end)))))
+ (cond
+ ;; Handle line count display.
+ ((when-let*
+ ((line-count (and treesit-fold-line-count-show
+ (count-lines beg end)))
+ (line-count-str (format treesit-fold-line-count-format line-count)))
+ (concat (or summary "") line-count-str)))
+ ;; `summary' handles truncation itself; just return it if not nil.
+ (summary )
+ ;; Fallback to ellipsis.
+ (t (truncate-string-ellipsis)))))
+
(defun treesit-fold--create-overlay (range)
"Create invisible overlay in RANGE."
(when range
@@ -400,9 +432,7 @@ This function is borrowed from `tree-sitter-node-at-point'."
(overlay-put ov 'priority treesit-fold-priority)
(overlay-put ov 'invisible 'treesit-fold)
(overlay-put ov 'display
- (propertize (or (and treesit-fold-summary-show
- (treesit-fold-summary--get (buffer-substring beg end)))
- (truncate-string-ellipsis))
+ (propertize (treesit-fold--format-overlay-text beg end)
'mouse-face 'treesit-fold-replacement-mouse-face
'help-echo "mouse-1: unfold this node"
'keymap map))
@@ -434,9 +464,11 @@ This function is borrowed from `tree-sitter-node-at-point'."
(let ((beg (overlay-start ov))
(end (overlay-end ov)))
(overlay-put ov 'invisible 'treesit-fold)
- (overlay-put ov 'display (or (and treesit-fold-summary-show
- (treesit-fold-summary--get (buffer-substring beg end)))
- (truncate-string-ellipsis)))
+ (overlay-put ov 'display
+ (propertize (treesit-fold--format-overlay-text beg end)
+ 'mouse-face 'treesit-fold-replacement-mouse-face
+ 'help-echo "mouse-1: unfold this node"
+ 'keymap (overlay-get ov 'keymap)))
(overlay-put ov 'face 'treesit-fold-replacement-face))
(treesit-fold-indicators-refresh))