Terminal Raw
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 nyx-edit implementa su editor de texto.
Código
// 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
if not isatty(0) {
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
}
Salida
not a terminal — skipping raw mode demo run interactively to see keypress reading
Explicación
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.