branch: elpa/cider
commit 7e9e70ce6647894d7833aa8598f4c48440d6444b
Author: Oleksandr Yakushev <a...@bytopia.org>
Commit: Bozhidar Batsov <bozhi...@batsov.dev>

    [overlays] Fix overlay slowness when huge result is displayed
---
 CHANGELOG.md      |  1 +
 cider-overlays.el | 19 +++++++++++++------
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1e83c9bbad..54819aefeb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,7 @@
 ### Bugs fixed
 
 - [#3763](https://github.com/clojure-emacs/cider/issues/3763): Fix 
`cider-docview-render` completion popup error when symbol being completed does 
not have a docstring.
+- [#3774](https://github.com/clojure-emacs/cider/issues/3774): Fix overlay 
hangup when evaluating huge values.
 
 ## 1.16.1 (2024-12-03)
 
diff --git a/cider-overlays.el b/cider-overlays.el
index f1808fafcd..8d0546606a 100644
--- a/cider-overlays.el
+++ b/cider-overlays.el
@@ -232,6 +232,8 @@ overlay."
                ;; Specify `default' face, otherwise unformatted text will
                ;; inherit the face of the following text.
                (display-string (format (propertize format 'face 'default) 
value))
+               ;; Maximum value width at which we truncate it.
+               (truncation-threshold (* 3 (window-width)))
                (o nil))
           ;; Remove any overlay at the position we're creating a new one, if it
           ;; exists.
@@ -245,17 +247,22 @@ overlay."
           ;; If the display spans multiple lines or is very long, display it at
           ;; the beginning of the next line.
           (when (or (string-match "\n." display-string)
+                    ;; string-width can be very slow on large results, so check
+                    ;; with a cheaper predicate first. Conservatively limit to
+                    ;; truncation threshold.
+                    (> (length display-string) truncation-threshold)
                     (> (string-width display-string)
                        (- (window-width) (current-column))))
             (setq display-string (concat " \n" display-string)))
-          ;; Put the cursor property only once we're done manipulating the
-          ;; string, since we want it to be at the first char.
-          (put-text-property 0 1 'cursor 0 display-string)
-          (when (> (string-width display-string) (* 3 (window-width)))
+          (when (or (> (length display-string) truncation-threshold)
+                    (> (string-width display-string) truncation-threshold))
             (setq display-string
-                  (concat (substring display-string 0 (* 3 (window-width)))
+                  (concat (substring display-string 0 truncation-threshold)
                           (substitute-command-keys
                            "...\nResult truncated. Type 
`\\[cider-inspect-last-result]' to inspect it."))))
+          ;; Put the cursor property only once we're done manipulating the
+          ;; string, since we want it to be at the first char.
+          (put-text-property 0 1 'cursor 0 display-string)
           ;; Create the result overlay.
           (setq o (apply #'cider--make-overlay
                          beg end type
@@ -285,7 +292,7 @@ overlay."
             (when (and (<= (window-start win) (point) (window-end win))
                        ;; Right edge is visible. This is a little conservative
                        ;; if the overlay contains line breaks.
-                       (or (< (+ (current-column) (string-width value))
+                       (or (< (+ (current-column) (string-width 
display-string))
                               (window-width win))
                            (not truncate-lines)))
               o)))))))

Reply via email to