3 Punkte von GN⁺ 2026-03-21 | 1 Kommentare | Auf WhatsApp teilen
  • 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

  • Voraussetzungen: CMake 3.19 oder höher, C-Compiler, Zig 0.15.x im PATH
  • Raylib wird automatisch über FetchContent von CMake heruntergeladen, falls es nicht installiert ist
  • Standard-Build-Ablauf
    cmake -B build -G Ninja  
    cmake --build build  
    ./build/ghostling  
    
  • Hinweis: Debug-Builds sind wegen Sicherheitsprüfungen sehr langsam und für Benchmarks ungeeignet
  • Release-Build
    cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release  
    cmake --build build  
    
  • Nach der ersten Einrichtung reicht cmake --build build aus

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

 
GN⁺ 2026-03-21
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

    • Ein Screenshot in deiner GitHub-README wäre hilfreich
      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

    • Hier ist das verwendete Build-Skript
      Mit dem Befehl cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmake
      konnte ich ein 1x1-Pixel-GIF in ein C-Array umwandeln
      Im automatisch generierten Header landet das Bild unverändert als Byte-Array
    • Als interessante Randnotiz: XPM-Bitmaps wurden ursprünglich so entworfen, dass man sie ohne Änderungen per #include einbinden kann
      Im X-PixMap-Wiki wird die Struktur gut erklärt
    • Mit dem xxd-Befehl aus dem vim-Paket lassen sich solche Arrays ebenfalls erzeugen
      Fü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
    • Als Windows-Programmierer fand ich es interessant, einen DrawTextEx-Aufruf zu sehen
      Es 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
    • Mit der Formulierung „endlich gefunden“ kann ich mich nicht anfreunden
      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 üblich
      In Java habe ich auch schon Pixel-Fonts direkt in .java-Dateien abgelegt
      Soweit 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