- Um demo de terminal com funcionalidade mínima baseado na API C do libghostty, operando com um único arquivo C e renderização com Raylib
- Estruturado para validar os recursos do libghostty-vt, mostrando uma implementação de terminal baseada em gráficos 2D em vez de renderização por GPU
- Suporta recursos em nível de terminal real, como reflow de texto, cor de 24 bits, processamento de Unicode e protocolos de mouse e teclado
- Alguns recursos, como Kitty Graphics Protocol e OSC para área de transferência e definição de título, ainda não foram implementados, e o suporte a Windows também não está incluído
- Aproveitando o núcleo do libghostty, oferece extensibilidade para que vários aplicativos combinem sua própria GUI ou renderizador
Visão geral do Ghostling
- Ghostling é um projeto de demonstração de terminal com funcionalidade mínima baseado na API C do libghostty, e é um exemplo composto por um único arquivo C
- Usa Raylib para gerenciamento de janela e renderização, operando em uma arquitetura de thread única
- Para mostrar a flexibilidade do libghostty-vt, usa um renderizador gráfico 2D em vez de renderização direta por GPU
- Não é um terminal completo para uso diário, mas um exemplo mínimo viável de implementação de terminal, com verificação limitada da correção do código
Introdução ao libghostty
- Libghostty é uma biblioteca embarcável de emulação de terminal extraída do núcleo do Ghostty, oferecendo APIs em C e Zig
- libghostty-vt é uma biblioteca sem dependências, responsável pelo gerenciamento do estado do terminal, como parsing de sequências VT, posição do cursor, estilos e scrollback
- Não inclui código de renderização nem de gerenciamento de janelas; os aplicativos que a utilizam devem implementar isso diretamente
- Baseado em código validado na GUI do Ghostty, oferece emulação de terminal precisa e completa, parsing otimizado com SIMD, suporte avançado a Unicode, uso eficiente de memória e estabilidade baseada em testes extensivos
Principais recursos
- Suporte a redimensionamento de janela com reflow de texto
- Suporte a cor de 24 bits e paleta de 256 cores, além de estilos negrito, itálico e vídeo reverso
- Tratamento de Unicode e grafemas com múltiplos code points (mas sem shaping nem layout)
- Tratamento de teclas modificadoras como Shift, Ctrl, Alt e Super
- Suporte a Kitty Keyboard Protocol, rastreamento de mouse (X10, normal, button, any-event) e múltiplos formatos de relatório de mouse (SGR, URxvt, UTF8, X10)
- Suporte a roda de rolagem e barra de rolagem arrastável, além de relato de foco (CSI I / CSI O)
- Inclui a maior parte dos recursos de emulação de terminal no mesmo nível da GUI do Ghostty
Recursos planejados
- Recursos que ainda não estão totalmente expostos no libghostty-vt
-
Kitty Graphics Protocol
-
Suporte a clipboard via OSC
- Definição de título via OSC
- O suporte a Windows é possível no libghostty-vt, mas ainda não foi implementado no Ghostling
- A lista deve ser expandida conforme novos recursos forem identificados no futuro
Recursos não fornecidos
- Como o libghostty se concentra no núcleo da emulação de terminal, ele não inclui recursos da camada de GUI
- Abas, múltiplas janelas, tela dividida, gerenciamento de sessão, arquivos de configuração, GUI, UI de busca etc. não estão incluídos
- Esses recursos devem ser implementados diretamente pelos aplicativos que usam o libghostty
- O Ghostling exclui intencionalmente esses recursos para manter o exemplo mínimo
Como compilar
FAQ
-
Por que usar C em vez de Zig
-
O libghostty-vt** fornece uma API Zig completa, mas a** API C é mais amplamente usada e mais acessível
- O Ghostling é um demo para mostrar um exemplo mínimo de uso da API C
-
Suporte a outras linguagens, como Rust
- libghostty-vt pode funcionar sem dependências por meio da API C
- Pode ser usado na maioria das linguagens com apenas bindings leves, e os bindings oficiais são centrados em C e Zig
- Espera-se que a comunidade desenvolva e mantenha bindings para várias linguagens
-
O Raylib é obrigatório?
- Não é obrigatório. O libghostty não impõe restrições quanto a renderizador ou framework de GUI
- Também pode operar de forma independente em ambientes WASM
- Fornece uma API de estado de renderização, permitindo integração com qualquer renderizador, como Metal, OpenGL ou Raylib
-
Por que escolher CMake e Raylib
- Não está preso a uma tecnologia específica, e o CMake é um sistema de build genérico com amplo suporte
-
O Raylib** é uma biblioteca simples e fácil de configurar** para janelas e renderização 2D
- O objetivo do projeto é mostrar um exemplo de uso do libghostty mais do que a escolha de tecnologias
1 comentários
Comentários do Hacker News
Estou usando libghostty no Trolley
Este projeto empacota TUIs como apps de desktop, de forma parecida com envolver um app web em Electron
Basicamente só adiciona uma GUI e um empacotador de CLI, e ainda assim funciona perfeitamente no Windows
Fiquei sinceramente impressionado com os desenvolvedores do Ghostty
Acho que ajudaria a entender de imediato que tipo de chrome (moldura da UI) o app adiciona em torno da TUI
O arquivo C é pequeno, então deu para ler tudo em poucos minutos
Lá pela quinta linha, fiquei surpreso ao ver uma abordagem incomum de embutir a fonte com um header gerado automaticamente
Eu estava acostumado com o método de recursos do Windows, mas aqui a estrutura gerava um array de bytes com código CMake
Foi meio chocante e ao mesmo tempo impressionante — parecia que eu finalmente tinha encontrado a solução para embutir recursos binários multiplataforma
Com o comando
cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmakefoi possível converter um GIF de 1x1 pixel em um array C
A imagem entra no header gerado automaticamente exatamente como um array de bytes
#includesem modificaçõesA wiki do X PixMap explica bem essa estrutura
xxddo pacotevimMas isso é ineficiente para recursos grandes — gcc/clang explodem a memória
Por isso eu uso o projeto LIEF
Ele permite inserir recursos em binários Windows PE, macOS Mach-O e Linux ELF e depois lê-los de volta
Com isso, consegui montar um sistema de empacotamento de recursos multiplataforma sem limite de tamanho
DrawTextExFoi um exemplo que mostrou bem a expressividade da biblioteca Ghostty
As outras escolhas de biblioteca também foram excelentes, e isso me inspirou a tentar criar um app de terminal eu mesmo
Incluir binários no código-fonte é uma técnica antiga
Isso já era comum nas linhas
DATAdo BASIC dos anos 70 e 80, e também em jogos de Atari ST e AmigaNo Java também já colocaram fontes pixel a pixel diretamente em arquivos
.javaOuvi dizer que algumas fontes do kernel Linux também são tratadas assim
Este projeto é interessante
Eu não preciso de abas nem de gerenciamento de sessões em um emulador de terminal
O WM gerencia janelas e abas, e o tmux cuida de sessões, scrollback, busca etc.
Então terminais simples como urxvt, st e foot sempre foram suficientes para mim
Ghostty não era muito do meu gosto, mas este vale testar
Está previsto suporte a OSC, e seria bom adicionar um sistema de plugins menos trabalhoso do que o do st