raw_mode_enter() desactiva el buffering de línea y el echo, permitiendo entrada carácter por carácter. read_byte() lee un solo byte. Siempre hay que llamar a raw_mode_exit() para restaurar el terminal. Así es como un editor de texto de pantalla completa lee la entrada.
// Raw terminal — reading keypresses without line buffering // Terminal raw — leer teclas sin buffer de línea fn main() -> int { // Check if we have a terminal. // `not` aplicado directo a la llamada de un builtin genera IR invalido // (xor i1 sobre un i64): se liga primero a un bool con tipo declarado. let tty: bool = isatty(0) if not tty { print("not a terminal — skipping raw mode demo") print("run interactively to see keypress reading") return 0 } print("terminal size: " + int_to_string(term_cols()) + "x" + int_to_string(term_rows())) print("press any key (or 'q' to quit):") // Enter raw mode — disables echo and line buffering raw_mode_enter() var running: bool = true while running { let byte: int = read_byte() if byte == 113 { // 'q' pressed running = false } else { // In raw mode, we need to manually handle output print("key: " + int_to_string(byte)) } } // Always restore terminal state raw_mode_exit() print("raw mode exited") return 0 }
not a terminal — skipping raw mode demo run interactively to see keypress reading
Cómo funciona
raw_mode_enter() pone el terminal en modo raw desactivando la entrada canónica (con buffer de línea) y el echo. En este modo, cada pulsación de tecla está disponible de inmediato vía read_byte() sin esperar Enter.
read_byte() lee un solo byte de stdin, devolviendo su valor entero. El ASCII 113 es el carácter 'q'. Teclas especiales como las flechas producen secuencias de escape (múltiples bytes que comienzan con 27).
raw_mode_exit() restaura el terminal a su estado previo. Siempre hay que llamar a esto antes de salir, incluso ante un error — de lo contrario el terminal quedará en modo raw y se volverá inutilizable. term_cols() y term_rows() devuelven las dimensiones actuales del terminal.