Ghostel: libghostty による高性能 Emacs ターミナルエミュレータ
Ghostel: libghostty による高性能 Emacs ターミナルエミュレータ
Ghostel は、Ghostty ターミナルのエンジンである libghostty-vt を活用した、Emacs 用の高性能ターミナルエミュレータです。Zig で書かれたネイティブな動的モジュールを使用することで、Ghostel はターミナルの状態管理、レンダリング、およびローカル PTY I/O を Emacs のメインスレッドからオフロードし、その結果、大幅なパフォーマンス向上と、通常 Emacs では利用できない最新のターミナルプロトコルへの対応を実現しています。
主なポイント
Ghostel は、vterm や eat に代わるモダンな選択肢を提供し、大幅に高いスループット(最大 75 MB/s)と Kitty グラフィックスおよびキーボードプロトコルのサポートを提供します。そのアーキテクチャにより、大量のデータバーストが発生してもレスポンシブな UI を維持でき、Emacs との深い統合により、パスワードプロンプトの検出、クリック可能なファイルパス、シェルから Elisp 関数を直接呼び出す機能などが可能になります。
パフォーマンスとアーキテクチャ
Ghostel は、Emacs のメインスレッドで出力を解析することで発生する、ターミナルエミュレータに共通の「UI フリーズ」問題を解決するように設計されています。
ネイティブ PTY と非同期処理
ローカルターミナルの場合、Ghostel はネイティブ PTY パスを使用します。Zig のバックグラウンドスレッドが PTY 出力を読み取り、非同期にターミナル状態を更新します。Emacs には、再描画や特定のコールバック(OSC ハンドラなど)が必要な場合にのみ通知が行われます。これにより、大量のログストリームが Emacs のイベントループをブロックすることを防ぎます。
スループット・ベンチマーク
Apple M4 Max でのベンチマークでは、Ghostel はプレーン ASCII のスループットにおいて、他の一般的な Emacs ターミナルを大幅に上回っています。
| Backend | Plain ASCII | URL-heavy |
|---|---|---|
| Ghostel | 75 MB/s | 36 MB/s |
| vterm | 18 MB/s | 15 MB/s |
| eat | 6.2 MB/s | 4.5 MB/s |
| term | 7.2 MB/s | 5.9 MB/s |
バースト吸収
10 MB の cat コマンドを実行した際、Ghostel のネイティブ PTY パスは約 110ms でデータを吸収します。これは vterm より約 5 倍、eat より約 16 倍高速です。解析がバックグラウンドスレッドで行われるため、プロセス全体を通じて Emacs の UI はレスポンシブなままです。
高度なターミナル機能
libghostty-vt を活用することで、Ghostel は Emacs にいくつかのモダンな機能をもたらします。
- Kitty Graphics Protocol: Emacs 内蔵の画像サポートを通じて、インライン画像(PNG, RGB, RGBA)をレンダリングします。これにより、
yaziやtimgのようなツールがバッファ内で直接画像を表示できるようになります。 - Synchronized Output (DEC 2026): モダンな TUI(例:Claude Code)における、途切れ途切れの不完全な再描画を排除します。
- Rich Text Attributes: 5 種類のアンダーライン(single, double, curly, dotted, dashed)を、独立した色でサポートします。また、フェイント/ディムテキストや打ち消し線もサポートします。
- OSC 8 Hyperlinks: ターミナルプログラムが生成するクリック可能な URL をネイティブにサポートします。
- Color Queries: OSC 4/10/11 をサポートし、TUI プログラムが Emacs のテーマのライト/ダークモードを自動検出できるようにします。
入力モードとユーザーエクスペリエンス
Ghostel は、ターミナル制御と Emacs の生産性を両立させるために、5 つの異なる入力モードを実装しています。
- Semi-char mode (Default): ほとんどのキーはターミナルに送られますが、いくつかのキー(例:
C-x,M-x)は Emacs 用に予約されています。 - Char mode: すべてのキーがターミナルに転送されます。Emacs の予約キーをバインドしている TUI で使用されます。
- Emacs mode: バッファは読み取り専用ビューになります。ターミナルは動作を継続しますが、ユーザーはシェルに影響を与えることなく、標準的な Emacs のナビゲーションや検索を使用できます。
- Copy mode: Emacs mode と同様ですが、ターミナルは停止(フリーズ)しており、正確なテキスト選択を行うための安定したスナップショットを提供します。
- Line mode: 入力は Emacs 内でローカルにバッファリングされ、完全な編集(Emacs キーを使用)が可能になります。
RETを押すと、原子的にシェルへ送られます。
Emacs との深い統合
Ghostel は、シェルとエディタの間の隔たりを埋めることで、ターミナル体験を拡張します。
- Password Prompt Detection: Ghostel は、プログラム(
sudoやsshなど)がパスワードを要求する際、それを検出します。ネイティブな Emacsread-passwdプロンプトを開くことで、パスワードがview-lossageやキーボードマクロの記録に残らないようにします。 - Calling Elisp from Shell: whitelisted system (
ghostel-eval-cmds) を通じて、シェルスクリプトから Emacs 関数を呼び出すことができます。例として、シェルエイリアスを作成して、ghostel_cmd dired-other-window "$(pwd)"を介して現在のディレクトリを Dired で開くことができます。 - TRAMP Support: Ghostel はリモートターミナル用に TRAMP と統合されています。リモートホスト上で
xterm-ghostty用の自動 terminfo インストール機能を含んでおり、リモート TUI が高精度なレンダリングを維持できるように設計されています。 - Compilation Mode:
ghostel-compileは、M-x compileの代替として TTY-backed な機能を提供します。これにより、色やプログレスバーが必要な本物の TTY が必要なプログラムを、compilation-modeの UX を維持しながらエラーナビゲーションを行えるようにします。
コミュニティの洞察
初期導入者からは、 Ghostel は実用的なデイリードライバーとして機能すると報告されていますが、まだ洗練の余地はあります。ユーザーは、サマリー内のコード参照を Emacs バッファで直接開くことの有用性を高く評価しています。一方で、一部のユーザーは、ターミナルのクリア操作や稀なフリーズに関する問題を指摘しており、プロジェクトがまだ成熟過程にあることを示唆しています。
"I recently switched from vterm to ghostel, and it is generally much, much better - noticeably faster... more reliable input handling, and a nicer ELisp API."
インストール
Ghostel は MELPA から利用可能です。ネイティブモジュールは初回使用時に自動的にダウンロードされるため、ほとんどのユーザーにとってローカルの Zig ツールチェーンを必要としません。
(use-package ghostel
:ensure t)