世界を動かす技術を、日本語で。

Ghostel.el: libghosttyによって動作するターミナルエミュレーター

2026年7月12日原文(dakra.github.io)

概要

  • Ghostel はEmacs用の高性能ターミナルエミュレータ
  • 最新の VTエンジン (libghostty-vt)を使用
  • 多彩な入力モード とシェル連携機能を搭載
  • ネイティブモジュール は自動ダウンロード可能
  • 幅広い プラットフォーム に対応(macOS, Linux, Windows等)

Ghostel概要

  • Ghostel はEmacs上で動作する ターミナルエミュレータ、libghostty-vt(Ghostty端末と同じVTエンジン)を採用
  • Zig製のネイティブダイナミックモジュール が端末状態・描画・PTY I/Oを管理し、Elispがキーマップやバッファ、リモートプロセス連携を担当
  • 既存の emacs-libvterm に着想を得た2層設計だが、Ghosttyの現代的なVTエンジンを活用
  • Kittyキーボード/グラフィックプロトコル、多彩な下線、OSC 8ハイパーリンク、OSC 4/10/11カラー、同期出力(DEC 2026)等をサポート
  • 初回利用時に自動でモジュールをダウンロード、通常は追加ツールチェーン不要
  • M-x ghostel でターミナルをすぐに起動可能

クイックスタート

  • use-package による設定例
    • キーバインドやプロジェクト連携、独自関数の送信例を記載
    • プロジェクト切り替えコマンドkill-ring 連携関数もサンプルあり
  • ghostel-eshell, ghostel-compile, ghostel-comint などの拡張も利用可能
  • evil-mode ユーザー向けにevil-ghostel拡張も用意

シェル連携の概要

  • ディレクトリ追跡プロンプトナビゲーション はデフォルトで有効(bash, zsh, fish等)
  • Emacs関数をシェルから呼び出し たい場合は、ghostel-eval-cmdsホワイトリストに追加
    • bashrc例: INSIDE_EMACS変数でghostel検出し、ghostel_cmdでEmacs関数呼び出し

入力モードの概要

  • 5種類のeat.elスタイル入力モード を提供
    • セミキャラクタモード (デフォルト):ほぼ全てのキーを端末に転送、一部例外(M-x, C-c等)
    • キャラクタモード :全てのキーを端末に転送、M-RETで終了
    • ラインモード :M-x shellのような動作、行入力後まとめて端末に送信
    • emacsモード/コピー(copy)モード :Emacsバッファとしてナビゲート・コピー可能
      • copyモードは出力をフリーズ、新規出力でスクロールしない
      • emacsモードはライブで新規出力が流れる
    • ghostel-readonly-fast-exit で、ほとんどのキー入力で自動的に通常モードへ復帰
    • マウス選択やハイパーリンク移動等で自動的にcopyモードが有効化

動作要件

  • Emacs 28.1以上 (ダイナミックモジュール対応必須)
  • macOS, Linux, FreeBSD, Windows(ネイティブ対応)
  • ネイティブモジュールは自動ダウンロード
    • aarch64-macos, x86_64-macos, x86_64-linux, aarch64-linux, x86_64-freebsd, x86_64-windows, aarch64-windows向けに事前ビルド済み
    • ソースビルドや他プラットフォーム用には Zig 0.15.2 が必要

インストール方法

  • MELPA でのインストール
    • (use-package ghostel :ensure t)
  • Emacs 30+のuse-package :vc
    • (use-package ghostel :vc (:url "https://github.com/dakra/ghostel" :lisp-dir "lisp" :rev :newest))
    • :lisp-dirはEmacs 31.1未満のみ必要
  • :load-path指定
    • (use-package ghostel :load-path "/path/to/ghostel/lisp")
  • 手動インストール
    • (add-to-list 'load-path "/path/to/ghostel/lisp")
    • (require 'ghostel)
    • M-x ghostelで起動

ネイティブモジュール管理

  • モジュール未検出時は自動でダウンロードまたはビルドを提案
    • ghostel-module-auto-install(デフォルトask)で制御
    • 手動操作: M-x ghostel-download-module, C-u M-x ghostel-download-module(リリースタグ指定)、M-x ghostel-module-compile(Zigでビルド)
    • デフォルトはパッケージディレクトリに配置、安定運用にはghostel-module-directoryで外部ディレクトリ指定推奨

Windows対応

  • WindowsネイティブEmacsビルド に対応(ダイナミックモジュール必須)
  • x86_64/aarch64向け事前ビルドモジュールを提供
  • ConPTY を利用し、Microsoftのredistributable console runtimeがあれば最新機能を利用可能
  • 付属ファイル未インストール時はWindows標準ConPTY APIにフォールバック
  • TRAMPによるリモート端末はPOSIX環境のみ対応、TRAMP/ssh経由でPTYはリモート側

この概要はGhostelの公式ドキュメント冒頭およびクイックスタート、要件、インストール方法、入力モード、Windows対応に関する主要ポイントを日本語で簡潔にまとめたものです。より詳細な各項目や設定例は、該当セクションの原文を参照してください。

Hackerたちの意見

最近、vtermからghostelに切り替えたんだけど、全体的にかなり良くなったよ。明らかに速くなったし(例えば、全フレームでターミナルをリフレッシュしようとするおしゃれなTUIアプリがちゃんと動く)、入力処理も信頼性が高いし、ELisp APIも使いやすくなった。ただ、まだいくつか粗いところがある。たまにターミナルをちゃんとクリアできなくて、現在のプロンプトの上にゴミが残っちゃうことがあるんだ。それに、何回かフリーズしたこともあって、その時はバッファを殺してやり直すしかなかった。全体的にはすごく期待できるし、日常使いには全然問題ないけど、成熟するにはもう少し磨きとバグ修正が必要かな。

Ghostelの共同メンテナーです。再現できないのは理解してるけど、もし何か具体的なことがあれば、ぜひ問題を報告してほしいです。画面の上にゴミが残るのは、もしかしたらhttps://github.com/dakra/ghostel/issues/495のことかもしれなくて、後のバージョンで修正されてるはずです。でも、別のバグかもしれませんね。libghostty-vtの内部データをEmacsバッファに再現しつつ、必要な部分だけを置き換えるのが難しいところです。これをテストするためのプロパティベースのテストもたくさんありますが、時々見逃しちゃうこともあります。今書いている最新のリリース版ではライフサイクル処理が改善されてるはずなので、あなたの問題も解決するかもしれません。おっしゃる通り、プロジェクトはまだ初期段階なので、時間をかけて改善していければと思っています。

これ、めっちゃ調子いいよ!Claudeコードの統合もあって、Emacsの使い方がかなり変わった。今やちょっとしたハブみたいになってる。

統合ってどういう意味?サーバー経由でEmacsを動かすモデルがあるの?

こんにちは!Ghostelのメンテナーです。baokaolaと私は実は来週「Show HN」をやりたかったんだけど、誰かが早くリンクを提出しちゃったみたいです。ちょっとした概要を見たいなら、GitHubのリポジトリを見てみてください:https://github.com/dakra/ghostel ちなみに、Ghostelはlibghostty-vtを使ったEmacs用のターミナルエミュレーターです。vtermやeatとの機能比較もあります:https://dakra.github.io/ghostel/#ghostel-vs-vterm そして、パフォーマンスと正確さを比較する画像付きのgistもあります:https://gist.github.com/dakra/4a0b76ebcf5d52338e134864378465... 個人的には、Ghostelはvterm/eatだけでなく、kitty/Ghosttyのような他の外部ターミナルも置き換えてくれました。ターミナルのテキストが普通のEmacsバッファのように扱えるのは、他のターミナルでは得られない多くの可能性や拡張ポイントを開いてくれます。スクロールバックで検索して、キーボードだけで段落をナビゲートして選択+コピーするような簡単なことも、Ghostelではすごく自然で速いけど、他のターミナルだとマウスに手を伸ばすことが多いです。質問があれば喜んで答えるし、ポジティブでもネガティブでもフィードバックも聞きたいです。もしEmacsユーザーでGhostelを試して、まだGhostty(または他の外部ターミナル)を使っているなら、Ghostelに足りないものがあるのか、それともEmacsの外でプロセスを動かしたいからなのか、教えてほしいです。baokaolaと私はGitHubでも非常にアクティブなので、何かあれば気軽に問題をオープンしてください。

こんにちは、dakra! > Ghostelに足りないものはありますか?eshellは、他のEmacsバッファと同じようにテキストを操作できるんです。単語を引用符で囲む関数を作って、それをキーにバインドすれば、eshellでも他の場所と同じように動くって自信を持てるんです。これは本当に強力な機能です。evil-modeやxah-fly-keysを使っている時や、単にispellで単語のスペルを修正したい時も、すべてうまくいきます。残念ながら、Ghostelではこれが機能しません。同じようには統合されていないんです。evil-ghostel-modeのような拡張もありますが、限界があります。これを改善する計画はありますか?それともGhostelが抱える制限なのでしょうか?eat-eshell-modeのGhostel版があれば素晴らしいですね。

みんなの統合はどうだった? 既存のサブシステム(レンダリングやOSCコードなど)に対して、ターミナル出力を消費する確立されたemacsシステムがあるから、統合は簡単だった? libghostty-vtの場合、外部サブシステムじゃなくてターミナルTUIをターゲットにしてるから、ターミナルのセマンティクスを理解しなきゃいけないよね。私の経験では、libghostty-vtをパーサーとしてmoshを再現しようとしたとき、最適化した再レンダリングがターミナルのセマンティクスにどんどん依存するようになっちゃった。そうしないと、毎回ネットワーク越しにターミナルグリッド全体を送らなきゃいけなくなるから。これをパフォーマンス良く、かつ全く無茶苦茶にならないようにするためのコツは何かある? tmuxに似た難しい問題もあって、特定の最適化が使えなかったり、特定の命令を(文字通り幾何学的に)変換しなきゃいけないこともあるよね。

こんにちは、素晴らしいプロジェクトだね。しばらくDoomと一緒に使ってるんだけど、他のエミュレーターが失敗するところで、どうやってスクロールするプログラム(例えばLazygitやReasonix)を動かしてるの?君の実装やライブラリに特別な何かがあるの?

Emacsの中でプロセスをもっと動かさない理由は、大きなdiffをmagitや似たようなもので解析すると、全てがブロックされちゃうからなんだ。結局、別のターミナルを使うことになっちゃう。

ネイティブモジュールは、初回使用時に自動でダウンロードされるプリビルドバイナリです。なぜ?配布の一部にしておいてほしい。

それは、MELPA(とELPA)がプラットフォーム特有のファイルを添付する方法を持っていないからです。すべてgitのチェックアウトだけなんです。つまり、配布に含めたい場合は、すべてのプラットフォーム用のモジュールバイナリをチェックインしなければならない(合計で10MB以上)ということです。また、例えばjinxのように、Emacsネイティブモジュールを使う人気のパッケージも、vtermのように初回使用時にコンパイルを提案しています。だから、Emacsパッケージの作者としては、ユーザーフレンドリーなインストールのために、初回使用時にダウンロードまたはコンパイルを提供するのが現実的な選択肢です。

タイトルにはEmacsの名前を入れるべきだと思います。ターミナルエミュレーターは、Emacs用のターミナルエミュレーターとは違いますから。

Hacker Newsで議論の続きを見る