;; https://invisible-island.net/xterm/ctlseqs/ctlseqs.html ;; Clear the screen better: ;; https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer (define csi-lead "\x1b;[") (define (str-csi . args) (apply string-append csi-lead args)) (define (csi-command! . args) (write-string (apply str-csi args)) (flush-output-port)) ; These are xterm things, but they are widely adopted (define (enable-alternate-buffer!) (csi-command! "?1049h")) (define (disable-alternate-buffer!) (csi-command! "?1049l")) (define (erase-screen!) (csi-command! "2J")) (define (move-cursor! x y) "Also valid with CSI;f being and line number and column number respectively. In ttys, cursor starts at 1,1" (csi-command! (number->string (+ y 1)) ";" (number->string (+ 1 x)) "H")) (define (ui-initialize!) (enable-alternate-buffer!) (move-cursor! 0 0)) (define (ui-deinitialize!) (disable-alternate-buffer!))