- Eine minimale Terminal-Demo auf Basis der libghostty C API, die mit einer einzigen C-Datei und Raylib-Rendering arbeitet
- Strukturiert zur Verifikation der Funktionen von libghostty-vt und zeigt eine Terminal-Implementierung auf Basis von 2D-Grafik statt GPU-Rendering
- Unterstützt Funktionen auf dem Niveau echter Terminals wie Text-Reflow, 24-Bit-Farben, Unicode-Verarbeitung sowie Maus- und Tastaturprotokolle
- Einige Funktionen wie das Kitty Graphics Protocol sowie OSC-Zwischenablage- und Titeleinstellung sind noch nicht implementiert, Windows-Unterstützung ist ebenfalls nicht enthalten
- Nutzt den Kern von libghostty und bietet die Erweiterbarkeit, damit verschiedene Anwendungen eigene GUIs oder Renderer kombinieren können
Überblick über Ghostling
- Ghostling ist ein minimales Terminal-Demoprojekt auf Basis der libghostty C API und ein Beispiel, das aus einer einzigen C-Datei besteht
- Es verwendet Raylib für Fensterverwaltung und Rendering und arbeitet in einer Single-Thread-Struktur
- Um die Flexibilität von libghostty-vt zu zeigen, verwendet es einen 2D-Grafik-Renderer statt direktem GPU-Rendering
- Es ist kein vollständiges Alltagsterminal, sondern ein Beispiel für eine minimal lauffähige Terminal-Implementierung; die Verifikation der Code-Korrektheit ist daher begrenzt
Einführung in libghostty
- Libghostty ist eine aus dem Kern von Ghostty extrahierte eingebettete Bibliothek für Terminal-Emulation und bietet APIs für C und Zig
- libghostty-vt ist eine abhängigkeitsfreie Bibliothek, die Terminalzustandsverwaltung wie VT-Sequenz-Parsing, Cursor-Position, Stile und Scrollback übernimmt
- Code für Rendering oder Fensterverwaltung ist nicht enthalten; Anwendungen, die sie nutzen, müssen das selbst implementieren
- Basierend auf Code, der in der Ghostty GUI validiert wurde, bietet sie präzise und vollständige Terminal-Emulation, SIMD-optimiertes Parsing, fortgeschrittene Unicode-Unterstützung, effiziente Speichernutzung und Stabilität durch umfangreiche Tests
Hauptfunktionen
- Unterstützung für Fenstergrößenänderung inklusive Text-Reflow
- Unterstützung für 24-Bit-Farben und 256-Farben-Palette sowie fette, kursive und inverse Darstellung
- Unicode- und Graphem-Verarbeitung mit mehreren Codepoints (allerdings ohne Shaping oder Layout)
- Verarbeitung von Modifikatortasten wie Shift, Ctrl, Alt, Super
- Unterstützung für Kitty-Tastaturprotokoll, Maus-Tracking (X10, normal, button, any-event) und mehrere Maus-Reporting-Formate (SGR, URxvt, UTF8, X10)
- Unterstützung für Mausrad und Scrollleiste per Drag sowie Fokus-Reporting (CSI I / CSI O)
- Enthält den Großteil der Terminal-Emulationsfunktionen auf dem gleichen Niveau wie die Ghostty GUI
Geplante Funktionen
- Funktionen, die in libghostty-vt noch nicht vollständig offengelegt sind
-
Kitty Graphics Protocol
-
OSC-Zwischenablagenunterstützung
- OSC-Titeleinstellung
- Windows-Unterstützung ist in libghostty-vt zwar möglich, in Ghostling aber noch nicht implementiert
- Die Liste soll künftig erweitert werden, sobald weitere ergänzende Funktionen gefunden werden
Nicht enthaltene Funktionen
- libghostty konzentriert sich auf den Kern der Terminal-Emulation und enthält daher keine Funktionen der GUI-Schicht
- Tabs, mehrere Fenster, Splitscreen, Sitzungsverwaltung, Konfigurationsdateien, GUI, Such-UI usw. sind nicht enthalten
- Diese Funktionen müssen von Anwendungen, die libghostty verwenden, selbst implementiert werden
- Ghostling lässt diese Funktionen bewusst weg, um ein minimales Beispiel zu bleiben
Build-Anleitung
FAQ
-
Warum C statt Zig verwendet wurde
- Obwohl libghostty-vt eine vollständige Zig-API bietet, ist die C-API weiter verbreitet und leichter zugänglich
- Ghostling ist eine Demo, die ein minimales Beispiel für die Nutzung der C-API zeigen soll
-
Unterstützung für andere Sprachen wie Rust
- libghostty-vt kann über die C-API ohne Abhängigkeiten verwendet werden
- In den meisten Sprachen ist die Nutzung mit dünnen Bindings möglich; offizielle Bindings konzentrieren sich auf C und Zig
- Es wird erwartet, dass die Community Bindings für verschiedene Sprachen entwickelt und pflegt
-
Ist Raylib zwingend erforderlich?
- Nein. libghostty macht keine Vorgaben für Renderer oder GUI-Frameworks
- Es kann auch in einer WASM-Umgebung unabhängig betrieben werden
- Es stellt eine Render-State-API bereit und kann daher mit Metal, OpenGL, Raylib oder jedem anderen Renderer kombiniert werden
-
Warum CMake und Raylib gewählt wurden
- Es ist nicht an eine bestimmte Technologie gebunden, und CMake ist ein allgemeines Build-System mit breiter Unterstützung
- Raylib ist eine einfache und leicht einzurichtende Bibliothek für 2D-Fenster und Rendering
- Ziel des Projekts ist weniger die Technologiewahl als vielmehr, ein Beispiel für den Einsatz von libghostty zu zeigen
1 Kommentare
Hacker-News-Kommentare
Ich verwende libghostty in Trolley
Dieses Projekt verpackt TUIs als Desktop-Apps, ähnlich wie man Web-Apps in Electron einhüllt
Im Grunde wurden nur ein GUI- und CLI-Bundler ergänzt, und es funktioniert sogar unter Windows perfekt
Ich bin von den Ghostty-Entwicklern wirklich beeindruckt
Dann ließe sich sofort verstehen, welches Chrome (UI-Rahmen) die App um die TUI herum ergänzt
Die C-Datei war so klein, dass ich sie in ein paar Minuten komplett lesen konnte
Etwa in Zeile 5 war ich überrascht, diese ungewöhnliche Methode zu sehen, den Font als automatisch generierten Header einzubetten
Ich war an die Windows-Ressourcenmethode gewöhnt, aber hier wurde per CMake-Code ein Byte-Array erzeugt
Das war leicht schockierend und zugleich beeindruckend — als hätte ich endlich eine Lösung für plattformübergreifendes Einbetten binärer Ressourcen gefunden
Mit dem Befehl
cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmakekonnte ich ein 1x1-Pixel-GIF in ein C-Array umwandeln
Im automatisch generierten Header landet das Bild unverändert als Byte-Array
#includeeinbinden kannIm X-PixMap-Wiki wird die Struktur gut erklärt
xxd-Befehl aus demvim-Paket lassen sich solche Arrays ebenfalls erzeugenFür große Ressourcen ist das aber ineffizient — gcc/clang explodieren beim Speicherverbrauch
Deshalb verwende ich das LIEF-Projekt
Damit lassen sich Ressourcen in Windows-PE-, macOS-Mach-O- und Linux-ELF-Binärdateien einfügen und wieder auslesen
So konnte ich ein plattformübergreifendes Resource-Bundling-System ohne Größenbeschränkung aufbauen
DrawTextEx-Aufruf zu sehenEs war ein Beispiel, das die Ausdrucksstärke der Ghostty-Bibliothek gut zeigt
Auch die Wahl der anderen Bibliotheken war hervorragend, und es hat mich inspiriert, selbst einmal eine Terminal-App zu bauen
Binärdaten im Quellcode einzubetten ist eine alte Technik
In BASIC der 70er und 80er gab es
DATA-Zeilen, und auch in Atari-ST- und Amiga-Spielen war so etwas üblichIn Java habe ich auch schon Pixel-Fonts direkt in
.java-Dateien abgelegtSoweit ich weiß, werden einige Fonts im Linux-Kernel ebenfalls auf diese Weise behandelt
Dieses Projekt ist interessant
Ich brauche in einem Terminal-Emulator keine Tabs oder Sitzungsverwaltung
Der WM verwaltet Fenster und Tabs, und tmux übernimmt Sitzungen, Scrollback, Suche usw.
Deshalb haben mir einfache Terminals wie urxvt, st und foot immer gereicht
Ghostty war nicht mein Geschmack, aber das hier ist einen Versuch wert
OSC-Unterstützung ist geplant, und es wäre schön, wenn noch ein Plugin-System dazukäme, das weniger umständlich ist als bei st