- libghostty C API をベースにした最小機能のターミナルデモで、単一の C ファイルと Raylib レンダリング を使って動作
- libghostty-vt の機能を検証するための構成で、GPU レンダリングの代わりに 2D グラフィックスベースのターミナル実装 を示す
- テキストリフロー、24ビットカラー、Unicode 処理、マウス・キーボードプロトコル など、実用的なターミナル水準の機能をサポート
- Kitty Graphics Protocol や OSC クリップボード・タイトル設定 など一部の機能は未実装で、Windows サポート も含まれない
- libghostty の中核を活用し、さまざまなアプリケーションが 独自の GUI やレンダラーを組み合わせられる拡張性 を提供
Ghostling 概要
- Ghostling は libghostty C API をベースにした最小機能のターミナルデモプロジェクトで、単一の C ファイルで構成されたサンプル
- Raylib を使用してウィンドウ管理とレンダリングを行い、シングルスレッド構成で動作
- libghostty-vt の柔軟性を示すため、GPU の直接レンダリングではなく 2D グラフィックスレンダラーを使用
- 完全な日常利用向けターミナルではなく、最小限で実行可能なターミナル実装例 であり、コードの正確性検証には限界がある
Libghostty 紹介
- Libghostty は Ghostty の中核から抽出された 組み込み向けターミナルエミュレーションライブラリ で、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 は最小サンプルを維持するため、これらの機能を意図的に除外している
ビルド方法
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件のコメント
Hacker Newsのコメント
私は libghostty を Trolley で使っている
このプロジェクトは、WebアプリをElectronで包むのに似た形で、TUIをデスクトップアプリとしてパッケージ化するものだ
単にGUIとCLIのバンドラーを足しただけなのに、Windowsでも完璧に動作する
Ghosttyの開発者たちには心から感心している
アプリがTUIの周囲にどんな chrome(UI外枠) を追加するのか、すぐ理解できそうだ
Cファイルが小さいので、数分で全部読めた
5行目あたりで、フォントを 自動生成されたヘッダー に埋め込む独特な方法を見て驚いた
Windowsのリソース方式には慣れていたが、これはCMakeコードでバイト配列を生成する構成だった
少し衝撃的でありつつ印象的だった — ついに クロスプラットフォームなバイナリリソース埋め込み の解法を見つけた気がした
cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmakeコマンドで1x1ピクセルのGIFをC配列に変換できた
自動生成されたヘッダーに画像がそのままバイト配列として入る
#includeできるよう設計されていたX PixMapのWikipedia にその構造がよく説明されている
vimパッケージのxxdコマンドでもこうした配列を作れるただし大きなリソースには非効率だ — gcc/clangがメモリ爆発 を起こす
なので私は LIEFプロジェクト を使っている
これはWindows PE、macOS Mach-O、Linux ELFバイナリにリソースを挿入して再び読み出せるようにしてくれる
おかげでサイズ制限のない クロスプラットフォームなリソースバンドリングシステム を構築できた
DrawTextEx呼び出しを見たのが興味深かったGhosttyライブラリの 表現力 をよく示すサンプルだった
他のライブラリ選択も素晴らしく、私もターミナルアプリを自作してみたくなる刺激を受けた
ソースコードにバイナリを含める のは昔からある手法だ
70〜80年代のBASICの
DATA行や、Atari ST、Amigaのゲームでもこうした方法はよく使われていたJavaでもピクセル単位のフォントを
.javaファイルに直接入れたことがあるLinuxカーネルの一部フォントもこの方法で処理されていると聞いたことがある
このプロジェクトは興味深い
私はターミナルエミュレータにタブやセッション管理機能を必要としない
WM がウィンドウとタブを管理し、tmux がセッション・スクロールバック・検索などを処理する
だから urxvt、st、foot のようなシンプルなターミナルで十分だった
Ghosttyは私の好みではなかったが、これは一度試してみる価値がありそうだ
OSCサポート が予定されていて、stより手間の少ない プラグインシステム が追加されるといい