3 ポイント 投稿者 GN⁺ 2026-03-21 | 1件のコメント | WhatsAppで共有
  • libghostty C API をベースにした最小機能のターミナルデモで、単一の C ファイルと Raylib レンダリング を使って動作
  • libghostty-vt の機能を検証するための構成で、GPU レンダリングの代わりに 2D グラフィックスベースのターミナル実装 を示す
  • テキストリフロー、24ビットカラー、Unicode 処理、マウス・キーボードプロトコル など、実用的なターミナル水準の機能をサポート
  • Kitty Graphics ProtocolOSC クリップボード・タイトル設定 など一部の機能は未実装で、Windows サポート も含まれない
  • libghostty の中核を活用し、さまざまなアプリケーションが 独自の GUI やレンダラーを組み合わせられる拡張性 を提供

Ghostling 概要

  • Ghostlinglibghostty C API をベースにした最小機能のターミナルデモプロジェクトで、単一の C ファイルで構成されたサンプル
  • Raylib を使用してウィンドウ管理とレンダリングを行い、シングルスレッド構成で動作
  • libghostty-vt の柔軟性を示すため、GPU の直接レンダリングではなく 2D グラフィックスレンダラーを使用
  • 完全な日常利用向けターミナルではなく、最小限で実行可能なターミナル実装例 であり、コードの正確性検証には限界がある

Libghostty 紹介

  • LibghosttyGhostty の中核から抽出された 組み込み向けターミナルエミュレーションライブラリ で、C と Zig API を提供
  • libghostty-vt依存関係のない ライブラリで、VT シーケンスの解析、カーソル位置、スタイル、スクロールバックなど ターミナル状態管理 を担う
    • レンダリングやウィンドウ管理のコードは含まず、これを利用するアプリケーション側で直接実装する必要がある
  • Ghostty GUI で検証されたコードベースにより、正確で完全なターミナルエミュレーションSIMD 最適化パーサー高度な Unicode サポート効率的なメモリ使用広範なテストに基づく安定性 を提供

主な機能

  • テキストリフローを含むウィンドウサイズ変更 をサポート
  • 24ビットカラーと 256 色パレットボールド・イタリック・反転表示スタイル をサポート
  • Unicode および複数コードポイントの書記素処理(ただしシェーピング・レイアウトなし)
  • Shift, Ctrl, Alt, Super などの修飾キー入力を処理
  • Kitty キーボードプロトコルマウストラッキング(X10, normal, button, any-event)複数のマウスレポート形式(SGR, URxvt, UTF8, X10) をサポート
  • スクロールホイールおよびドラッグスクロールバーフォーカスレポート(CSI I / CSI O) をサポート
  • Ghostty GUI と同等水準のターミナルエミュレーション機能 の大半を含む

予定されている機能

  • まだ libghostty-vt で完全には公開されていない機能
    • Kitty Graphics Protocol

    • OSC クリップボードサポート

      • OSC タイトル設定
      • Windows サポート は libghostty-vt では可能だが、Ghostling では未実装
      • 今後追加機能が見つかるたびに、この一覧は拡張される予定

提供されない機能

  • libghostty はターミナルエミュレーションの中核に集中しているため、GUI レイヤー機能は含まない
    • タブ、複数ウィンドウ、分割画面、セッション管理、設定ファイル、GUI、検索 UI などは含まれない
  • これらの機能は libghostty を使うアプリケーション側で直接実装する必要がある
  • Ghostling は最小サンプルを維持するため、これらの機能を意図的に除外している

ビルド方法

  • 必須要件: CMake 3.19 以上、C コンパイラ、PATH に Zig 0.15.x
  • Raylib はインストールされていない場合、CMake の FetchContent により自動でダウンロードされる
  • 基本的なビルド手順
    cmake -B build -G Ninja  
    cmake --build build  
    ./build/ghostling  
    
  • 注意: デバッグビルドは安全性チェックのため非常に遅く、ベンチマークには不向き
  • Release ビルド
    cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release  
    cmake --build build  
    
  • 初期設定後は cmake --build build だけを実行すればよい

FAQ

  • Zig の代わりに C を使った理由

    • libghostty-vt** は完全な Zig API を提供しているが、** C API のほうがより広く使われ、アクセスしやすい

      • Ghostling は 最小限の C API 利用例 を示すためのデモ
  • Rust など他言語のサポート

    • libghostty-vt は C API を通じて ゼロ依存 で動作可能
    • 多くの言語で薄いバインディングだけで利用可能で、公式バインディングは C と Zig が中心
    • コミュニティがさまざまな言語バインディングを開発・保守することを期待
  • Raylib は必須か

    • 必須ではない。libghostty はレンダラーや GUI フレームワークに制約を設けていない
    • WASM 環境 でも独立して動作可能
    • レンダリング状態 API を提供し、Metal・OpenGL・Raylib など任意のレンダラーと組み合わせ可能
  • CMake と Raylib を選んだ理由

    • 特定技術に依存せず、CMake は汎用的でサポートの広いビルドシステム
    • Raylib** はシンプルで設定しやすい** 2D ウィンドウ・レンダリングライブラリ

      • プロジェクトの目的は技術選定そのものではなく、libghostty の活用例 を示すことにある

1件のコメント

 
GN⁺ 2026-03-21
Hacker Newsのコメント
  • 私は libghosttyTrolley で使っている
    このプロジェクトは、WebアプリをElectronで包むのに似た形で、TUIをデスクトップアプリとしてパッケージ化するものだ
    単にGUIとCLIのバンドラーを足しただけなのに、Windowsでも完璧に動作する
    Ghosttyの開発者たちには心から感心している

    • GitHubのREADMEに スクリーンショット が1枚でもあるといい
      アプリがTUIの周囲にどんな chrome(UI外枠) を追加するのか、すぐ理解できそうだ
  • Cファイルが小さいので、数分で全部読めた
    5行目あたりで、フォントを 自動生成されたヘッダー に埋め込む独特な方法を見て驚いた
    Windowsのリソース方式には慣れていたが、これはCMakeコードでバイト配列を生成する構成だった
    少し衝撃的でありつつ印象的だった — ついに クロスプラットフォームなバイナリリソース埋め込み の解法を見つけた気がした

    • ここで使われている ビルドスクリプト を共有する
      cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmake コマンドで
      1x1ピクセルのGIFをC配列に変換できた
      自動生成されたヘッダーに画像がそのままバイト配列として入る
    • 面白い事実として、XPMビットマップ はもともと修正なしで #include できるよう設計されていた
      X PixMapのWikipedia にその構造がよく説明されている
    • vim パッケージの xxd コマンドでもこうした配列を作れる
      ただし大きなリソースには非効率だ — gcc/clangがメモリ爆発 を起こす
      なので私は LIEFプロジェクト を使っている
      これはWindows PE、macOS Mach-O、Linux ELFバイナリにリソースを挿入して再び読み出せるようにしてくれる
      おかげでサイズ制限のない クロスプラットフォームなリソースバンドリングシステム を構築できた
    • Windowsプログラマーとして DrawTextEx 呼び出しを見たのが興味深かった
      Ghosttyライブラリの 表現力 をよく示すサンプルだった
      他のライブラリ選択も素晴らしく、私もターミナルアプリを自作してみたくなる刺激を受けた
    • 「ついに見つけた」という表現には同意しない
      ソースコードにバイナリを含める のは昔からある手法だ
      70〜80年代のBASICの DATA 行や、Atari ST、Amigaのゲームでもこうした方法はよく使われていた
      Javaでもピクセル単位のフォントを .java ファイルに直接入れたことがある
      Linuxカーネルの一部フォントもこの方法で処理されていると聞いたことがある
  • このプロジェクトは興味深い
    私はターミナルエミュレータにタブやセッション管理機能を必要としない
    WM がウィンドウとタブを管理し、tmux がセッション・スクロールバック・検索などを処理する
    だから urxvt、st、foot のようなシンプルなターミナルで十分だった
    Ghosttyは私の好みではなかったが、これは一度試してみる価値がありそうだ
    OSCサポート が予定されていて、stより手間の少ない プラグインシステム が追加されるといい