- Demo de terminal con funcionalidad mínima basada en la API C de libghostty, que funciona con un solo archivo C y renderizado con Raylib
- Estructurado para validar las capacidades de libghostty-vt, mostrando una implementación de terminal basada en gráficos 2D en lugar de renderizado por GPU
- Soporta funciones de nivel de un terminal real como reflujo de texto, color de 24 bits, manejo de Unicode y protocolos de mouse y teclado
- Algunas funciones como Kitty Graphics Protocol y OSC para portapapeles y configuración de título aún no están implementadas, y tampoco incluye soporte para Windows
- Aprovecha el núcleo de libghostty para ofrecer extensibilidad que permite combinar GUIs o renderizadores propios en distintas aplicaciones
Resumen de Ghostling
- Ghostling es un proyecto de demostración de terminal con funcionalidad mínima basado en la API C de libghostty, presentado como un ejemplo compuesto por un solo archivo C
- Usa Raylib para la gestión de ventanas y el renderizado, y opera con una arquitectura de un solo hilo
- Para mostrar la flexibilidad de libghostty-vt, utiliza un renderizador gráfico 2D en lugar de renderizado directo por GPU
- No es un terminal completo para uso diario, sino un ejemplo de implementación de terminal mínimo viable, por lo que la verificación de exactitud del código es limitada
Introducción a libghostty
- Libghostty es una biblioteca embebible de emulación de terminal extraída del núcleo de Ghostty, y ofrece APIs para C y Zig
- libghostty-vt es una biblioteca sin dependencias encargada de la gestión del estado del terminal, como el análisis de secuencias VT, posición del cursor, estilos y scrollback
- No incluye código de renderizado ni de gestión de ventanas; las aplicaciones que la usan deben implementarlo por su cuenta
- Basada en código validado en la GUI de Ghostty, ofrece emulación de terminal precisa y completa, parsing optimizado con SIMD, soporte avanzado de Unicode, uso eficiente de memoria y estabilidad respaldada por pruebas extensivas
Funciones principales
- Soporte para cambio de tamaño de ventana con reflujo de texto
- Soporte para color de 24 bits y paleta de 256 colores, además de estilos negrita, cursiva e inverso
- Manejo de Unicode y grafemas de múltiples code points (aunque sin shaping ni layout)
- Manejo de teclas modificadoras como Shift, Ctrl, Alt y Super
- Soporte para Kitty Keyboard Protocol, seguimiento del mouse (X10, normal, button, any-event) y múltiples formatos de reporte del mouse (SGR, URxvt, UTF8, X10)
- Soporte para rueda de desplazamiento y barra de desplazamiento arrastrable, además de reporte de foco (CSI I / CSI O)
- Incluye la mayoría de las funciones de emulación de terminal al mismo nivel que la GUI de Ghostty
Funciones previstas
- Funciones que aún no están completamente expuestas en libghostty-vt
-
Kitty Graphics Protocol
-
Soporte de portapapeles OSC
- Configuración de título OSC
- Soporte para Windows es posible en libghostty-vt, pero aún no está implementado en Ghostling
- La lista se ampliará conforme se identifiquen funciones adicionales en el futuro
Funciones no incluidas
- libghostty se enfoca en el núcleo de la emulación de terminal, por lo que no incluye funciones de la capa GUI
- No incluye pestañas, múltiples ventanas, pantalla dividida, gestión de sesiones, archivo de configuración, GUI, interfaz de búsqueda, etc.
- Estas funciones deben ser implementadas directamente por las aplicaciones que usen libghostty
- Ghostling las excluye intencionalmente para mantener un ejemplo mínimo
Cómo compilar
FAQ
-
Por qué se usó C en lugar de Zig
-
libghostty-vt ofrece una API completa en Zig, pero la API de C está más difundida y es más accesible
- Ghostling es una demo para mostrar un ejemplo mínimo de uso de la API C
-
Soporte para otros lenguajes como Rust
- libghostty-vt puede funcionar sin dependencias a través de la API de C
- Puede usarse desde la mayoría de los lenguajes con bindings ligeros, y los bindings oficiales se centran en C y Zig
- Se espera que la comunidad desarrolle y mantenga bindings para varios lenguajes
-
Si Raylib es obligatorio
- No es obligatorio. libghostty no impone restricciones sobre el renderizador ni el framework GUI
- También puede funcionar de manera independiente en entornos WASM
- Ofrece una API de estado de renderizado, por lo que puede combinarse con cualquier renderizador como Metal, OpenGL o Raylib
-
Por qué se eligieron CMake y Raylib
- No depende de una tecnología específica, y CMake es un sistema de compilación genérico con amplio soporte
-
Raylib es una biblioteca simple y fácil de configurar para ventanas y renderizado 2D
- El objetivo del proyecto es mostrar un ejemplo de uso de libghostty más que promover una elección tecnológica
1 comentarios
Comentarios de Hacker News
Estoy usando libghostty en Trolley
Este proyecto empaqueta TUI como apps de escritorio, parecido a envolver una web app con Electron
Solo le añadí un bundler de GUI y CLI, y funciona perfectamente incluso en Windows
Estoy sinceramente impresionado con los desarrolladores de Ghostty
Creo que ayudaría a entender de inmediato qué tipo de chrome (marco/interfaz exterior) agrega la app alrededor del TUI
El archivo C es tan pequeño que pude leerlo completo en unos minutos
Cerca de la línea 5 me sorprendió ver una forma poco común de incrustar la fuente con un header autogenerado
Yo estaba acostumbrado al método de recursos de Windows, pero aquí la estructura genera un arreglo de bytes con código de CMake
Fue un poco impactante y a la vez impresionante — sentí que por fin había encontrado la solución para la incrustación de recursos binarios multiplataforma
Con el comando
cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmakepude convertir un GIF de 1x1 píxel en un arreglo de C
La imagen queda tal cual dentro del header autogenerado como arreglo de bytes
#includesin modificacionesLa wiki de X PixMap explica bien esa estructura
xxddel paquetevimPero es ineficiente para recursos grandes — gcc/clang explotan en uso de memoria
Por eso yo uso el proyecto LIEF
Esto permite insertar recursos y luego volver a leerlos en binarios Windows PE, macOS Mach-O y Linux ELF
Gracias a eso pude construir un sistema de empaquetado de recursos multiplataforma sin límites de tamaño
DrawTextExFue una muestra que dejaba ver bien la expresividad de la librería Ghostty
Las otras elecciones de librerías también fueron excelentes, y me inspiró a querer intentar hacer yo mismo una app de terminal
Incluir binarios en el código fuente es una técnica vieja
Esto era común en las líneas
DATAde BASIC en los 70 y 80, y también en juegos de Atari ST y AmigaEn Java también llegué a meter fuentes pixeladas directamente en archivos
.javaTengo entendido que algunas fuentes del kernel de Linux también se manejan de esta forma
Este proyecto me parece interesante
Yo no necesito pestañas ni gestión de sesiones en un emulador de terminal
El WM se encarga de las ventanas y pestañas, y tmux maneja las sesiones, el scrollback, las búsquedas, etc.
Así que terminales simples como urxvt, st o foot me bastaban
Ghostty no era de mi gusto, pero esto sí parece algo que vale la pena probar
Está previsto soporte para OSC, y estaría bien que agregaran un sistema de plugins menos engorroso que el de st