Fix top/vim in TUI terminal: restore live vtscreen rendering on data

ober

23f9ba8917fcfb0f6155c0c36d4b4e1754dec8a6

diff --git a/src/jerboa-emacs/app.ss b/src/jerboa-emacs/app.ss
index 2f8bdbc..7c2ea7c 100644
--- a/src/jerboa-emacs/app.ss
+++ b/src/jerboa-emacs/app.ss
@@ -426,21 +426,17 @@
                (set! (terminal-state-pre-pty-text ts)
                  (editor-get-text ed)))
              (if vt
-               ;; Feed data to VT100 screen buffer, then render
+               ;; Feed data to VT100 screen buffer, then render live
                (begin
                  (vtscreen-feed! vt data)
-                 (if (vtscreen-alt-screen? vt)
-                   ;; Alt-screen (vim, top): replace entire content
-                   (let ((rendered (vtscreen-render vt)))
-                     (editor-set-text ed rendered)
-                     (editor-goto-pos ed (editor-get-text-length ed))
-                     (editor-scroll-caret ed))
-                   ;; Normal command output: vtscreen accumulates it,
-                   ;; but we don't replace text (that nukes styles).
-                   ;; Just scroll to end — 'done handler will append final output.
-                   (begin
-                     (editor-goto-pos ed (editor-get-text-length ed))
-                     (editor-scroll-caret ed))))
+                 (let* ((rendered (vtscreen-render vt))
+                        (full (if (vtscreen-alt-screen? vt)
+                                rendered
+                                (string-append (or (terminal-state-pre-pty-text ts) "")
+                                               rendered))))
+                   (editor-set-text ed full)
+                   (editor-goto-pos ed (editor-get-text-length ed))
+                   (editor-scroll-caret ed)))
                ;; Fallback: strip ANSI and append (no vtscreen)
                (let* ((segments (parse-ansi-segments data))
                       (start-pos (editor-get-text-length ed)))