Redirect stderr to log file (or /dev/null) during TUI

ober

7e5ca8799c5eb374d05e37eb284ca4c4f5773ef0

diff --git a/src/jcode/ui/tui.ss b/src/jcode/ui/tui.ss
index 0a5075e..eadd659 100644
--- a/src/jcode/ui/tui.ss
+++ b/src/jcode/ui/tui.ss
@@ -61,6 +61,28 @@
       (close-port p)
       (*tui-log-port* #f))))
 
+(def *saved-stderr* (make-parameter #f))
+
+(def (redirect-stderr-for-tui! verbose?)
+  "Redirect stderr away from terminal. If verbose, send to ~/jcode.log; else /dev/null."
+  (*saved-stderr* (current-error-port))
+  (current-error-port
+    (if (and verbose? (*tui-log-port*))
+      (*tui-log-port*)
+      (open-file-output-port "/dev/null"
+        (file-options no-fail)
+        (buffer-mode none)
+        (make-transcoder (utf-8-codec))))))
+
+(def (restore-stderr!)
+  (when (*saved-stderr*)
+    (let ((devnull (current-error-port)))
+      (current-error-port (*saved-stderr*))
+      (*saved-stderr* #f)
+      ;; Close /dev/null port (but not the log port, that's closed separately)
+      (unless (eq? devnull (*tui-log-port*))
+        (close-port devnull)))))
+
 ;; ---- Spinner animation ----
 
 (def *spinner-frames* '#("⠋" "⠙" "⠹" "⠸" "⠼" "⠴" "⠦" "⠧" "⠇" "⠏"))
@@ -136,8 +158,10 @@
   (session-init-db)
   (init-tools-for-tui)
   (apply-tui-overrides! args)
-  (when (member "--verbose" args) (open-tui-log!))
-  (tui-log "tui-main: starting, args=~a" args)
+  (let ((verbose? (and (member "--verbose" args) #t)))
+    (when verbose? (open-tui-log!))
+    (tui-log "tui-main: starting, args=~a" args)
+    (redirect-stderr-for-tui! verbose?))
   (with-tui
     (tui-log "tui-main: tb-init done")
     (let ((in-mode (bitwise-ior TB_INPUT_ALT TB_INPUT_MOUSE)))
@@ -159,6 +183,7 @@
       (tb-present!)
       (tui-log "tui-main: entering event loop")
       (event-loop state)
+      (restore-stderr!)
       (close-tui-log!))))
 
 (def (init-tools-for-tui)