1 ポイント 投稿者 GN⁺ 4 시간 전 | 3件のコメント | WhatsAppで共有
  • Ghostelは、Ghosttyと同じlibghostty-vtエンジンを使用するEmacsターミナルエミュレーターで、Zigネイティブモジュールがターミナル状態・レンダリング・ローカルPTY入出力を担当し、Elispがキーマップ・バッファ・コマンド・リモートプロセスを管理する
  • Kittyキーボード/グラフィックプロトコル、OSC 8ハイパーリンク、OSC 4/10/11カラー問い合わせ、DEC 2026同期出力と5種類の入力モードに対応し、ローカルのbash・zsh・fish・nushellにはシェル統合を自動適用する
  • Emacs 28.1以降とmacOS・Linux・FreeBSD・ネイティブWindowsをサポートし、初回利用時にプラットフォーム別の事前ビルド済みモジュールを自動でダウンロードできるため、一般的なインストールではZigツールチェーンは不要
  • Apple M4 MaxとEmacs 32.0.50で1MB出力を処理したベンチマークでは、通常のASCIIでGhostel 75MB/s、vterm 18MB/s、eat 6.2MB/sを記録し、ネイティブPTYは10MBのcat処理を約110msで吸収した
  • TRAMPリモートターミナル、パスワード入力保護、Kittyインライン画像、コンパイル・Eshell・Comint・Evil・入力メソッド連携まで提供するが、リモート先と画像処理にはプラットフォームおよびプロトコル上の制約がある

構成とインストール

  • Ghostelはemacs-libvtermの2層設計に着想を得ているが、libvtermの代わりにGhosttyのモダンなVTエンジンを使用する
    • Zigモジュールはターミナル状態、レンダリング、キーエンコーディング、ローカルPTYとバックグラウンド読み取りを処理する
    • Elispはキーマップ、バッファ、コマンド、プロジェクト連携、TRAMPリモートプロセスを担当する
  • 要件は、動的モジュールをサポートするEmacs 28.1以降と、macOS・Linux・FreeBSDまたはネイティブWindows
    • 事前ビルド済みバイナリは、aarch64-macosx86_64-macosx86_64-linuxaarch64-linuxx86_64-freebsdx86_64-windowsaarch64-windows向けに提供される
    • ほかのプラットフォームやソースビルドにはZig 0.15.2が必要
  • MELPA、Emacs 30以降のuse-package :vc:load-path、手動のrequire方式でインストールでき、M-x ghostelでターミナルを開く
  • ネイティブモジュールがない場合、ghostel-module-auto-install設定に従ってダウンロードまたはソースコンパイルを提案する
    • M-x ghostel-download-moduleは最低限サポートされるバイナリを取得し、接頭引数を付けるとリリースタグを選択できる
    • M-x ghostel-module-compilezig buildでモジュールをビルドする
    • パッケージディレクトリが再インストールされる可能性がある場合は、ghostel-module-directoryを別の場所に指定できる
  • ソースビルドには生成済みのvendor/emacs-module.hが含まれるため、通常はローカルのEmacsヘッダーは不要で、EMACS_INCLUDE_DIRまたはEMACS_BIN_DIRでヘッダー位置を変更できる
    • コンパイル済みのxterm-ghostty terminfoはetc/terminfo/に含まれ、BSDとncursesで移植可能な形式

Windowsサポート

  • ネイティブWindows EmacsではConPTYでローカルターミナルを実行し、モジュールDLLのアーキテクチャはWindowsではなくEmacsのアーキテクチャと一致している必要がある
  • 事前ビルド済みモジュールと一緒にconpty.dllOpenConsole.exeのサポートファイルをダウンロードし、これらのファイルがない場合はWindows内蔵のConPTY APIにフォールバックする
  • 静的CRTなどの特殊なカスタムEmacsビルドはベストエフォート方式でのみサポートする
  • WindowsのTRAMPターミナルはPOSIXリモート先のみサポートし、PTYはリモートホスト上に存在する。動的なウィンドウサイズ変更は現時点ではサポートしない

5種類の入力モード

  • デフォルトのsemi-charモードはほとんどのキーをターミナルへ送る一方、C-cC-xC-uC-hM-xM-:C-\のような例外はEmacs側に残す
    • 割り込み・中断・EOF送信、bracketed paste、スクロールバック削除、プロンプトおよびハイパーリンク移動のためのキーを提供する
  • charモードはすべてのキーをターミナルへ送るため、自前でC-xM-xC-hを使うTUIに適しており、M-RETだけが脱出キーとして残る
  • Emacsモードはターミナル出力を受け続けながらバッファを読み取り専用に変え、isearchoccur、マークとコピーなど標準のEmacsナビゲーションを可能にする
    • 通常の入力はシェルへ渡されず、意図的なC-y貼り付けだけがbracketed pasteとして送信される
  • copyモードはターミナル更新を止め、安定して選択・移動・コピーできるようにする
    • コピーしたテキストでは、ソフトラップによって生じた改行を除去する
    • デフォルトのghostel-readonly-fast-exit=tでは、文字入力またはコピー後に自動で通常のターミナルセッションへ戻る
  • lineモードはキーをシェルへ即座に送らず、Emacsバッファで1行を編集してからRETでまとめて送信する
    • 非同期出力や新しいプロンプトが到着しても、入力中の内容をスナップショットとして保持してから再挿入する
    • OSC 133があればプロンプト境界を使用し、なければghostel-prompt-regexpで境界を探す
    • 全画面TUIが開始されるとsemi-charモードに切り替わり、TUI終了後にlineモードへ戻る
    • TABはcomint補完と、任意でbash programmable completionを使用する
  • マウスドラッグ、複数クリック、マーク有効化、isearchまたはconsult-lineでライブ入力位置から外れた場合、デフォルトではcopyモードへ切り替えて選択と位置を保護する
    • TUIがDECマウス追跡を有効にしている場合、入力モードではマウスイベントをそのプログラムへ渡す
    • ghostel-mouse-drag-input-modeghostel-mark-activation-input-modeghostel-point-leave-input-modeで切り替え動作を変更できる

ターミナル機能とレンダリング

  • libghostty-vtを通じて、完全なVTエミュレーション、256色と24ビットカラー、alternate screen、複数の下線スタイルと色、太字・斜体・淡色・取り消し線・反転、4種類のカーソル形状と点滅をサポートする
  • デフォルトのTERM=xterm-ghosttyと同梱terminfoは、DEC 2026同期出力、Kittyキーボード、true color、色付き下線、フォーカス報告などの機能をアプリケーションへ知らせる
    • OSC 4/10/11問い合わせにより、TUIはEmacsフェイスの色からパレットと前景・背景色を取得できる
    • OSC 52クリップボードはサポートするが、デフォルトでは無効なため、同梱terminfoではMs機能を広告しない
  • デフォルトのスクロールバックは5MB、約5,000行で、Emacsバッファとして実体化されるため、isearchconsult-lineで検索できる
  • OSC 8ハイパーリンクのほか、通常のHTTP・HTTPS URLと/path/file.el:42形式のファイルパスを検出し、クリック可能なリンクにする
  • GhosttyキーエンコーダーとKittyキーボードプロトコル、SGRマウスイベント、DEC 1004フォーカスイベント、ファイルパスおよびテキストのドラッグ&ドロップをサポートする
  • レンダラーは変更のない行をスキップし、タイマーで更新をバッチ化し、フレームレートを適応的に調整する
    • キー入力直後に到着したPTYエコーは、デフォルトの33msタイマーを迂回して即座にレンダリングする
    • ghostel-sync-themeはEmacsテーマに合わせてパレットを再同期する
  • 16個のANSI色はterm-color-*を継承するEmacsフェイスであり、ghostel-defaultでターミナル専用のフォント・サイズ・前景・背景を設定できる

シェル統合と Emacs 呼び出し

  • bash・zsh・fish・nushell には OSC 7 ディレクトリ追跡、OSC 133 プロンプト移動、OSC 2 タイトル追跡と ghostel_cmd を自動設定する
    • nushell 自体のシェル統合が OSC 7・133・2 を提供し、ghostel.nughostel_cmd と outbound SSH terminfo ラッパーを追加する
    • macOS 内蔵の bash 3.2 は自動注入に使う ENV を無視するため、新しい bash を使うか ghostel.bash を手動で読み込む必要がある
  • シェルから Elisp を呼び出す ghostel_cmd は専用の OSC 52;e 拡張を使い、ghostel-eval-cmds の許可リストにある関数だけを実行する
    • デフォルトで許可される関数は find-filefind-file-other-windowdireddired-other-windowmessage
  • Emacs ブックマークはターミナルの作業ディレクトリとバッファ名を保存する
    • 既存バッファがあれば再利用し、なければ保存されたディレクトリで新しいシェルを起動する
    • スクロールバックとセッション内容は保存しない

パスワード・クリップボード・通知

  • sudosshgpgpasswd などのパスワードプロンプトを検出すると read-passwd を開き、回答を PTY に直接送るため、入力は view-lossage、最近のキーリング、キーボードマクロに残らない
    • ローカルでは canonical モードと echo の無効化を tcgetattr で確認する
    • リモートシェルでのみ正規表現による代替検出を使い、ローカルの raw-mode TUI における誤検知を減らす
    • 送信後、パスワード文字列は直ちに clear-string 処理する
    • ghostel-password-prompt-functions に auth-source、KeePass、pass などの供給元を追加できる
  • OSC 52 を明示的に有効化すると、リモートプログラムが Emacs kill ring とシステムクリップボードを設定でき、貼り付けは bracketed paste で送信する
  • OSC 9 と OSC 777 の通知は ghostel-notification-function に渡す
    • デフォルトハンドラーは、インストールされていれば alert を使い、なければ echo 領域の message にフォールバックする
  • OSC 9;4 の進捗は removeseterrorindeterminatepause 状態と 0〜100 の値を渡す
    • デフォルトのテキスト表示器と spinner.el ベースのアニメーション表示器を提供する

Kitty インライン画像

  • Kitty graphics protocol の直接配置と U+10EEEE Unicode-placeholder 配置をサポートし、timgkitty +kitten icatyazi などの画像をレンダリングする
  • PNG は同梱の stb デコーダーで処理し、RGB・RGBA・Gray・GrayAlpha データはネイティブモジュールで PPM に変換するため、ImageMagick は不要
  • CSI 14・16・18 t のサイズ問い合わせに応答し、ghostel-cell-pixel-scale で物理ピクセル比を設定できる
  • 画像処理には次の制約がある
    • アルファチャンネルは合成せず削除するため、半透明のエッジには適さない
    • Kitty source-rect の部分切り抜きはサポートせず、明示的なエラーを返す
    • 同じバッファ内の複数の仮想配置は 1 つのレンダリングを共有し、直近の送信が優先される
    • デフォルトでは inline base64 のみ許可し、ファイル・一時ファイル・共有メモリ媒体は安全のため明示的に有効化する必要がある
    • ターミナルごとのデフォルトのグラフィック保存上限は 320MiB

TRAMP とリモート terminfo

  • default-directory が TRAMP パスなら、その POSIX ホストでシェルを実行し、SSH 系 TRAMP 方式や docker などのシェルを ghostel-tramp-shells で指定できる
    • login-shellgetent passwd でリモートユーザーのログインシェルを検出する
    • OSC 7 ディレクトリ追跡は既存の TRAMP の方式・ユーザー・マルチホップ接頭辞を保持する
    • Windows のリモート対象は、この POSIX シェル・tty 経路ではサポートしない
  • リモートシェル統合はデフォルトでは注入せず、2 つの方式を提供する
    • ghostel-tramp-shell-integration=t で一時スクリプトを転送し、終了時にクリーンアップする
    • 永続ホストには etc/shell/ スクリプトと、任意で terminfo を直接インストールできる
  • リモートに xterm-ghostty terminfo がないとターミナルを開くのに失敗することがあり、ghostel-ssh-install-terminfo がインストールを処理する
    • TRAMP 実行では既存接続で一時ディレクトリに terminfo を転送し、終了時に削除する
    • ローカル Ghostel から実行した sshssh -G で対象を正規化してキャッシュを参照し、必要なら 1 回の追加接続で tic -x - を実行する
    • ローカル terminfo のハッシュがキャッシュキーに含まれるため libghostty 更新時に自動で無効化されるが、リモート側で別途変更された terminfo は検出できない
    • ssh HOST cmd、ホストのないオプション呼び出し、ローカルに infocmp がない場合はインストールをスキップする
  • リモートホストを変更したくない場合は自動インストールをオフにして自分で terminfo をインストールでき、ghostel-termxterm-256color に変えれば関連設定は不要になるが、Ghostty 専用の 同期出力高速経路も失われる

Emacs 拡張機能

  • evil-ghostel は Evil の insert・normal 状態とターミナルカーソルを同期する
    • 移動、挿入、削除、変更、置換、bracketed paste、readline undo と状態別カーソル形状をサポートする
    • alternate screen の vim・less・htop には影響しない
  • ghostel-compile は実際の PTY でコマンドを実行しつつ、compilation-mode 形式のヘッダー・フッター・エラー強調・next-error ナビゲーションを提供する
    • デフォルトは読み取り専用のナビゲーションで、前置引数を与えると対話的入力を渡す
    • 実行中でも C-c C-jC-c C-e または C-c C-t で対話的入力とコンパイルナビゲーションを切り替えられる
    • ghostel-compile-global-modecompilerecompileproject-compilecompilation-start 呼び出しを Ghostel に送る
    • grep-mode はデフォルトで既存実装を維持する
  • ghostel-eshell-visual-command-mode は Eshell の vim・htop・less のような 視覚コマンド(visual command)term-mode ではなく専用の Ghostel バッファで実行する
  • ghostel-comint-mode は comint 出力ストリームを libghostty-vt で処理し、true color、多様な下線、OSC 8 リンク、OSC 7 ディレクトリ更新を提供する
    • 完全なターミナルではないため、カーソル配置、alternate screen、全画面再描画は捨て、htopless には適さない
  • ghostel-ime-mode はハングルなど、バッファに直接文字を挿入する Elisp 入力メソッドの結果を消してから UTF-8 で PTY に渡す
    • Quail の合成中はレンダリングを遅らせ、バッファが合成文字列を上書きしないようにする

パフォーマンス

  • Apple M4 MaxとEmacs 32.0.50で、実プロセスのパイプに1MBを送り、約1,000行のスクロールバックを保持した結果は次のとおり
    • 通常のASCII: Ghostel 75MB/s、リンク検出無効のGhostel 76MB/s、vterm 18MB/s、eat 6.2MB/s、内蔵term 7.2MB/s
    • URLが多い出力: Ghostel 36MB/s、リンク検出無効のGhostel 78MB/s、vterm 15MB/s、eat 4.5MB/s、term 5.9MB/s
  • URL・ファイルパス検出は再描画パスの外にある統合タイマーで実行されるため、通常の出力ではコストがほとんどないが、リンクが密集した出力ではスループットが約半分に低下する
  • 公平な比較のため、上記の数値はEmacsプロセス経路を使用しており、デフォルトのローカルネイティブPTYではZigのバックグラウンドスレッドが出力を読み取るため、継続的な大容量ダンプで約2倍高速になる
  • 10MBファイルをcatした5回の中央値は、ネイティブGhostelが約110ms、Emacs PTY Ghostelが約220ms、vtermが約550ms、eatが約1.8秒
    • vtermとeatは転送中にEmacsのメインスレッドを同期的に占有するが、GhostelのネイティブPTYはバックグラウンドでパースするため、UIは引き続き応答する
  • M-x ghostel-debug-typing-latencyは、キーごとのPTY・レンダリング・全体遅延の最小値、中央値、p99、最大値を測定する

vterm・eatとの違い

  • vtermはCベースのlibvtermネイティブモジュールを使用し、eatは純粋なElispで書かれていてビルドなしで移植できる代わりにスループットは低い
  • GhostelだけがKittyキーボード・グラフィックス、5種類の下線、OSC 8、OSC 4/10/11、OSC 9・777通知、OSC 9;4進捗率、DEC 2026をすべてサポートする
    • eatはSixel画像をサポートするがKitty画像はサポートせず、vtermはどちらの画像プロトコルもサポートしない
  • GhostelとeatはSGRマウスイベントをTUIに渡すが、vtermはクリックをEmacsのポイント移動に使う
  • Ghostelとeatはlineモードを提供するが、vtermは提供しない
    • Ghostelは出力が止まるcopyモードと、出力が続くEmacsモードの両方を提供する
    • vtermは停止型のcopyモードを提供し、eatの読み取り専用Emacsモードは更新され続ける
  • Ghostelはシェル統合を自動注入するが、vtermとeatでは手動でスクリプトを読み込む必要がある
  • パスワードプロンプトはGhostelが自動検出し、eatは手動送信コマンドのみを提供し、vtermは入力を別途インターセプトしない

内部アーキテクチャ

  • ローカルバッファはデフォルトでZigがPTYを開いて子プロセスを生成した後、バックグラウンドスレッドで出力をlibghostty-vtへ渡す
    • OSCコールバックや再描画が必要な場合は、LispイベントをEmacsのパイプへ送り、ghostel--events-filterが処理する
    • 大量出力がEmacsプロセスフィルターをバイト単位で通過することはない
  • TRAMPバッファはリモート生成とファイルハンドラーを維持するため、Emacsプロセスが出力を受け取り、同じターミナルモデルへ同期的に渡す
  • キー入力はlibghosttyエンコーダーを経由してPTYへ即座に書き込まれ、出力はVTパーサーと無効化ステップを経て、対話的なエコーであれば即時に、そうでなければ統合タイマーでRenderer.zigが変更された行を更新する
  • ターミナルレンダリングは、行の置換、全体再描画、サイズ変更とreflow、スクロールバックの追加・削除によってEmacsバッファを修正するため、レンダラーがポイント・マーク・ウィンドウ位置の保持を担う
    • Elispは、入力後にライブビューポートへ移動するか、各モードでナビゲーション状態を維持するかといったポリシーとユーザーの意図を決定する
    • レンダラーの変化をElispのredraw前後のヒューリスティックで補正すると、ユーザーのスクロール、redisplay補正、サイズ変更、コンテンツ再書き込みの原因を区別しにくくなるため、避けるべき

テストとライセンス

  • テストはERTベースで、ElispテストはZigモジュールなしで実行でき、nativeタグ付きテストにはビルド済みモジュールが必要
    • Zig単体テスト、全体テスト、Evil拡張テスト、クイックベンチマーク用のMakefileターゲットを提供する
  • バグや機能リクエスト、プルリクエストはGitHubリポジトリで受け付けており、レンダリング問題には再現コマンド・escape sequence・Emacsバージョン・プラットフォーム情報が必要
  • M-x ghostel-debug-infoで診断イベントを収集できる
  • GhostelはGNU GPL v3以降で配布される自由ソフトウェア

3件のコメント

 
lum7671 1 시간 전

日本語入力はできないように思います。
Ctrl-\ を押すと入力方式は日本語に切り替わるようですが、実際には英字入力しかできないようですね。
少し残念です。

 
GN⁺ 2 시간 전
Lobste.rs のコメント
  • Emacs のターミナルエミュレーションの最終解は Ghostelだと思う。簡単な一回限りのターミナルウィンドウには実際の Ghostty を使い、プロジェクト作業には ghostel-project コマンドでそのプロジェクトに紐づいた Ghostel を使っている
    プロジェクト用のインスタンスがすでにあれば、そのインスタンスにそのまま切り替わるので、ターミナル間の行き来が非常に速い
  • Doom Emacs をもう一度試して、統合がどれほどうまくいくか確認してみたくなった。前回諦めた理由の一つが Emacs ターミナルの不安定さだった
    • 自分も試してみたい。vterm には不満な点もあるが、ターミナル内でもエディタのコマンドをそのまま使える点は本当に良い
      Emacs でターミナルエミュレータの話になると、よく cd/mv/ls/cp/rm/mkdr/... の代わりに dired、ビルドコマンドの代わりに compile を使えばいいのに、なぜ必要なのかという反応が返ってくる。だが複雑な作業をしないとしても、ターミナルのほうがより慣れていて柔軟に感じる
      特に Doom Emacs でターミナルへの依存度を下げる方法を案内するガイドがあるなら、試してみたい。高度な設定でプロジェクトを素早く行き来する様子はいつ見ても印象的だ
    • Emacs のターミナルエミュレーションはほぼ完璧に実用できるレベルまで来ているにもかかわらず、一部世代のターミナルツールが vterm のような環境で壊れたり、行サイズ計算の問題で jj の画面が時々完全に崩れたりして、もどかしい
      結局、横に Ghostty を開いておくことになるが、いつかすべてのツールが Emacs 内で正しく動くようになってほしい
  • eat-eshell に相当する機能がなさそうなので、自分には選びにくい。より高速なターミナルエミュレーションには関心があるが、eshell をかなり使っている
    eat-eshell を使うと、ビルドツールや Podman CLI のようにターミナルエミュレーションを必要とするプログラムや TUI アプリケーションも eshell バッファ内でそのまま動作するため、eshell をよく使う人にとっては状況を一変させる機能だ
    • ターミナルでもできるのに、eshell を別に使う用途が何なのか気になる。eshell をあまり使っていないので、その目的を見落としているように感じることがよくある
 
GN⁺ 4 시간 전
Hacker Newsのコメント
  • Ghostelのメンテナーです。baokaolaと来週Show HNを投稿するつもりでしたが、誰かが先にリンクを投稿していました
    ざっと見るならGitHubリポジトリのほうが便利です: https://github.com/dakra/ghostel
    Ghostelはlibghostty-vtベースのEmacsターミナルエミュレータで、vtermやeatとの機能比較はhttps://dakra.github.io/ghostel/#ghostel-vs-vtermで見られます。性能と正確性を画像で比較した資料もあります: https://gist.github.com/dakra/4a0b76ebcf5d52338e134864378465...
    個人的には、vterm/eatだけでなくkittyやGhosttyのような外部ターミナルまで置き換えました。ターミナルのテキストを普通のEmacsバッファのように扱えると、他のターミナルにはない数多くの拡張可能性が開けます。スクロールバックを検索し、その後キーボードだけで移動して段落を選択・コピーするような簡単な作業も、Emacsユーザーにははるかに自然で高速です
    Ghostelを使っても外部ターミナルを残すなら、機能不足が理由なのか、それとも一部のプロセスをEmacsの外で動かしたいのか気になります。GitHubでも積極的に対応しているので、問題があればイシューを開いてください

    • これまでのところGhostelはとてもよく動いています。f1セミ文字モードとコピーモードの切り替えに割り当てていて、コマンドを実行する前に「Emacsが落ちたり強制終了しても大丈夫か?」と考えています。大丈夫でなければ普通のターミナルで実行します
    • Magitなどが大きなdiffをパースするとEmacs全体が固まることがあるので、結局は別のターミナルを使い続けています
    • eshellでは他のEmacsバッファとまったく同じようにテキストを操作できます。単語を引用符で囲む関数をキーに割り当てればeshellでもそのまま動きますし、evil-mode・xah-fly-keys・ispellもすべて使える点が決定的な利点です
      Ghostelはそこまで同じレベルでは統合されておらず、evil-ghostel-modeのような拡張にも限界があります。これを改善する計画があるのか、構造的に受け入れざるを得ない制約なのか気になりますし、eat-eshell-modeに相当する機能ができれば素晴らしいと思います
    • WezTermのパターンベースQuick-selectモードがあるといいですね。この機能を知ってからは、他のターミナルを使いたくないと思うほどです
    • Doom Emacsでしばらく快適に使っています。LazygitやReasonixのような画面をスクロールするプログラムが他のエミュレータでは失敗するのに、Ghostelでは動くのはなぜなのか気になります。実装やライブラリに特別な処理があるのでしょうか
  • タイトルにはEmacsを入れるべきです。一般的なターミナルエミュレータとEmacs用ターミナルエミュレータは別物です

    • プロジェクトを知らない状態なら、ドキュメントよりhttps://github.com/dakra/ghostelにリンクしたほうが有用です
    • .elEmacs Lispファイル拡張子です
  • 最近vtermからGhostelに乗り換えましたが、全体的にはるかに優れています。毎フレーム端末全体を更新する派手なTUIアプリもきちんと動くほど目に見えて速く、入力処理もより安定していて、ELisp APIも良いです
    ただ、ターミナルをきれいに消去できず現在のプロンプトの上にゴミが残ったり、完全に固まってバッファを閉じて再起動しなければならなかったこともあります。日常利用には十分で将来性も明るいですが、成熟した製品になるにはバグ修正と仕上げ作業がまだ必要です

    • Ghostelの共同メンテナーです。再現手順がなくても、実行可能な情報が出てきたらイシューを登録するか別の方法で伝えてください
      画面上部にゴミが残る現象はhttps://github.com/dakra/ghostel/issues/495かもしれず、最新版では修正されていますが、別のバグの可能性もあります。難しいのは、libghostty-vtの内部データをEmacsバッファへ複製しつつ必要な部分だけ置き換えることです。これを広範囲に検証するプロパティベーステストがありますが、ときどき問題を取り逃がします
      現在の最新リリースではライフサイクル処理が改善されており、一部の問題はそれで一緒に解決しているかもしれません。まだ初期段階なので、徐々に磨いていきたいと思っています
  • 異なる入力モードを効率よく使う実例があるとよいですね。ターミナルはすべてのキー入力を欲しがり、エディタも独自コマンドにキーを使いたがるため、エディタ内蔵ターミナルにはキーボードの所有権を切り替えるモードが必須です
    Neovimの:termにはモードが2つしかないのに、Ghostelにはなぜ5つもあるのかを理解しないと、過剰設計だと誤解しやすいです。実際にはより多くの問題を解決するために複雑になっており、追加モードはnvimが扱わない作業のための任意のツールです。ただ、その利点を実運用でどう効率的に活かすかはまだ十分明確ではありません

  • vtermの使用に苦労していたところGhostelを試してみたら素晴らしく、メインのターミナルになるかもしれないと思っています

    • vtermからeatを経てGhostelに移ってきましたが、少なくとも今のところはGhostelが最良だと思います
  • 1か月以上使っていますが、Codexの要約に出てきたコード参照をクリックしてEmacsバッファで直接開ける機能が特に気に入っています

    • マウスだけでなく、ghostel-previous-hyperlinkghostel-next-hyperlinkで最近表示されたハイパーリンク間をすばやく移動できます
      repeat-modeマップも入るので、出力にURLやファイルリンクが3つあるならC-c C-p p p RETだけで最初のリンクを開けて、よく使っています
  • GhostelとClaude Codeの統合のおかげでEmacsの使用量が大きく増え、今ではEmacsが作業の中央ハブになっています

    • ここでいう統合とは、モデルがサーバー経由でEmacsを直接操作するという意味なのか気になります
  • いくつかのウィンドウにターミナルを10個ほど開くと、Ghosttyがほぼ毎晩クラッシュしていました。そのためGhosttyをまともに使えず、毎日使うツールの中に組み込みたいとも思いません

    • Gentoo LinuxでGhostty 1.1.3を使っていて、現在は約12個のウィンドウにそれぞれ20個ほどのタブを開き、100個を超えるシェルインスタンスを動かしています
      数百万ファイルあるファイルシステム上で、できるだけ多くのシェルにls -lRも実行しましたが、問題やクラッシュはありませんでした。ここ数か月、毎日一日中かなり激しく使っていますが、クラッシュや怪しい挙動を見たことはありません
      特定のGhosttyバージョンのバグか、GPUドライバのような別ソフトウェアとの特殊な相互作用である可能性が高そうです。こちらではNVIDIA GPUを使っています
  • 「ネイティブモジュールは事前ビルド済みバイナリで、初回使用時に自動ダウンロードされる」とありますが、なぜ配布パッケージに含めないのか気になります

    • MELPAとELPAにはプラットフォーム別ファイルを添付する方法がなく、すべてGitチェックアウトとして配布されます。配布物に含めるには、すべてのプラットフォーム向けモジュールバイナリをリポジトリに入れる必要があり、合計で10MBを超えます
      Emacsネイティブモジュールを使う人気パッケージのjinxも、vtermのように初回使用時にコンパイルする方式を提供しています。したがって、Emacsパッケージでユーザーフレンドリーなインストールを実現するには、現実的には初回実行時にダウンロードまたはコンパイルする方法しかありません