fix(eval): eros overlay going off-screen

Evaluating code (and :tools (eval +overlay) enabled) will do one of two
things with the return value:

If long, it will be displayed in a popup window on the bottom of the
frame. If short (<3-4 lines), it will be displayed in an overlay at the
end of the line.

If you happened to have scrolled horizontally (such that the BOL isn't
visible), the overlay would be displayed offscreen and unreadable. Any
attempt to scroll it into view will cause it to disappear (as per its
transient nature). This fix pads each newline in said overlay such that
the overlay is pushed into view.
This commit is contained in:
Henrik Lissner 2022-08-07 17:38:58 +02:00
parent e5acbd7c40
commit 790c2a6d84
No known key found for this signature in database
GPG key ID: B60957CA074D39A3

View file

@ -24,11 +24,33 @@
(defun +eval-display-results-in-overlay (output &optional source-buffer)
"Display OUTPUT in a floating overlay next to the cursor."
(require 'eros)
(let ((this-command #'+eval/buffer-or-region)
eros-overlays-use-font-lock)
(let* ((this-command #'+eval/buffer-or-region)
(prefix eros-eval-result-prefix)
(lines (split-string output "\n"))
(prefixlen (length prefix))
(len (+ (apply #'max (mapcar #'length lines))
prefixlen))
(col (- (current-column) (window-hscroll)))
(next-line? (or (cdr lines)
(< (- (window-width)
(save-excursion (goto-char (point-at-eol))
(- (current-column)
(window-hscroll))))
len)))
(pad (if next-line?
(+ (window-hscroll) prefixlen)
0))
(where (if next-line?
(line-beginning-position 2)
(line-end-position)))
eros-eval-result-prefix
eros-overlays-use-font-lock)
(with-current-buffer (or source-buffer (current-buffer))
(eros--make-result-overlay output
:where (line-end-position)
(eros--make-result-overlay
(concat (make-string (max 0 (- pad prefixlen)) ?\s)
prefix
(string-join lines (concat "\n" (make-string pad ?\s))))
:where where
:duration eros-eval-result-duration))))
;;;###autoload