Ir al contenido

TTY

Módulo de UI de terminal para eventos de entrada en bruto, salida estilizada y utilidades de diseño.

Este módulo solo funciona dentro del contexto de terminal. No se puede usar desde funciones regulares — solo desde procesos que se ejecutan en un Terminal Host.
local tty = require("tty")

Inicie el lector de entrada en bruto, suscríbase a eventos y procéselos en un bucle:

local tty = require("tty")
local io = require("io")
local function handler()
tty.start()
local events = tty.events()
while true do
local ev = events:receive()
if not ev then break end
if ev.type == "key" then
if ev.key == "q" or (ev.ctrl and ev.key == "c") then
break
end
io.print("Key: " .. ev.key)
elseif ev.type == "resize" then
io.print("Size: " .. ev.width .. "x" .. ev.height)
end
end
tty.stop()
end

Habilita el modo de entrada en bruto del terminal. El terminal cambia al modo en bruto y comienza a emitir eventos.

local ok, err = tty.start()

Retorna: boolean, error

Deshabilita la entrada en bruto y restaura el terminal al modo normal.

local ok, err = tty.stop()

Retorna: boolean, error

Suscríbase a eventos del terminal y retorna un canal. Los eventos se entregan como tablas con un campo type.

local events = tty.events()

Retorna: EventChannel, error

Consulta las dimensiones actuales del terminal.

local width, height, err = tty.screen_size()

Retorna: number, number, error

Habilita o deshabilita el seguimiento de eventos del ratón.

local ok, err = tty.mouse(true)
ParámetroTipoDescripción
enablebooleantrue para habilitar, false para deshabilitar

Retorna: boolean, error

Los eventos son tablas con un campo type que determina qué otros campos están presentes.

{
type = "key",
key = "a", -- printable character or key name
key_type = "runes", -- "runes" for printable, or special key name
action = "press", -- "press" or "release"
alt = false,
ctrl = false,
shift = false
}

Requiere tty.mouse(true).

{
type = "mouse",
action = "press", -- "press", "release", "motion", "wheel"
button = "left", -- button name
x = 10,
y = 5,
alt = false,
ctrl = false,
shift = false
}
{type = "resize", width = 120, height = 40}

Emitido una vez después de tty.start() con las dimensiones iniciales.

{type = "start", width = 120, height = 40}
{type = "focus", focused = true}
{type = "paste", text = "pasted content"}

Cree atajos de teclado reutilizables que coincidan con eventos de tecla:

local quit = tty.bind({
keys = {"q", "ctrl+c"},
help = {key = "q/ctrl+c", desc = "quit"}
})
-- In event loop
if quit:matches(ev) then
break
end
CampoTipoDescripción
keysstring[]Patrones de tecla a coincidir (ej. "a", "ctrl+c", "enter")
helptableOpcional. {key = "...", desc = "..."} para texto de ayuda

Retorna: KeyBinding

MétodoRetornaDescripción
matches(event)booleanVerifica si un evento de tecla coincide con este atajo
set_enabled(bool)selfHabilita o deshabilita el atajo
is_enabled()booleanVerifica si el atajo está habilitado
help()tableRetorna información de ayuda {key, desc}

Cree salida de texto estilizada usando estilizado basado en lipgloss. Todos los métodos de estilo retornan un nuevo estilo (inmutable).

local tty = require("tty")
local io = require("io")
local title = tty.style()
:bold()
:foreground("#FF0000")
:padding(0, 1)
local box = tty.style()
:border(tty.borders.ROUNDED)
:border_foreground("#00FF00")
:width(40)
:padding(1, 2)
io.print(box:render(title:render("Hello"), "World"))

Crea un nuevo estilo vacío.

Retorna: Style

Todos los métodos retornan un nuevo Style y pueden encadenarse.

MétodoParámetroDescripción
foreground(color)stringColor de texto (hex "#FF0000", ANSI "9", o nombre)
background(color)stringColor de fondo
bold(enable?)booleanTexto en negrita (predeterminado: true)
italic(enable?)booleanTexto en cursiva
underline(enable?)booleanTexto subrayado
strikethrough(enable?)booleanTexto tachado
faint(enable?)booleanTexto atenuado
blink(enable?)booleanTexto parpadeante
reverse(enable?)booleanIntercambia primer plano/fondo
MétodoParámetroDescripción
width(n)numberAncho fijo
height(n)numberAlto fijo
max_width(n)numberAncho máximo
max_height(n)numberAlto máximo
padding(...)numbersPadding (estilo CSS: arriba, derecha, abajo, izquierda)
margin(...)numbersMargen (estilo CSS)
align(pos)numberAlineación horizontal
align_vertical(pos)numberAlineación vertical
inline(enable?)booleanModo de renderizado en línea
MétodoParámetroDescripción
border(name, ...)string, booleansEstilo de borde, alternativas opcionales por lado
border_foreground(...)stringsColor(es) del borde
border_background(...)stringsColor(es) de fondo del borde
MétodoDescripción
render(...)Renderiza cadenas con este estilo aplicado
copy()Crea una copia de este estilo
tty.borders.NORMAL
tty.borders.ROUNDED
tty.borders.THICK
tty.borders.DOUBLE
tty.borders.HIDDEN
tty.align.LEFT -- 0
tty.align.CENTER -- 0.5
tty.align.RIGHT -- 1

Funciones de diseño y medición para texto estilizado. Disponibles bajo tty.text.

local w = tty.text.width("hello") -- printable width (ANSI-aware)
local h = tty.text.height("a\nb\nc") -- line count
local w, h = tty.text.size("hello\nworld") -- both
-- Join side by side, aligned at top
local row = tty.text.join_horizontal(tty.text.position.TOP, left, right)
-- Stack vertically, centered
local col = tty.text.join_vertical(tty.text.position.CENTER, top, bottom)
local w = tty.text.max_width({"short", "a longer string"}) -- widest
local h = tty.text.max_height({"one\ntwo", "single"}) -- tallest

Coloca una cadena dentro de una caja de dimensiones dadas:

-- Center in a 80x24 box
local out = tty.text.place(80, 24, tty.text.position.CENTER, tty.text.position.CENTER, content)
-- Horizontal only
local out = tty.text.place_horizontal(80, tty.text.position.RIGHT, content)
-- Vertical only
local out = tty.text.place_vertical(24, tty.text.position.BOTTOM, content)
tty.text.position.TOP -- 0
tty.text.position.LEFT -- 0
tty.text.position.CENTER -- 0.5
tty.text.position.BOTTOM -- 1
tty.text.position.RIGHT -- 1