Ghostel: 由 libghostty 提供動力的極高性能 Emacs 終端機模擬器
Ghostel: 由 libghostty 提供動力的極高性能 Emacs 終端機模擬器
Ghostel 是一款為 Emacs 設計的高性能終端機模擬器,它利用了 libghostty-vt,這與驅動 Ghostty 終端機的 VT 引擎相同。透過使用由 Zig 編寫的原生動態模組,Ghostel 將終端機狀態管理、渲染以及本地 PTY I/O 從 Emacs 主執行緒中卸載,從而實現顯著的性能提升,並支援 Emacs 通常無法使用的現代終端機協定。
關鍵要點
Ghostel 為 vterm 和 eat 提供了一個現代化的替代方案,提供了大幅提高的吞吐量(高達 75 MB/s)並支援 Kitty 圖形與鍵盤協定。其架構允許在處理大量數據突發時仍保持 UI 的響應性,而其與 Emacs 的深度整合則實現了諸如密碼提示檢測、可點擊的文件路徑以及直接從 shell 調用 Elisp 函數的功能。
性能與架構
Ghostel 的設計旨在解決終端機模擬器在 Emacs 主執行緒上解析輸出時常見的「UI 凍結」問題。
原生 PTY 與非同步處理
對於本地終端機,Ghostel 使用原生 PTY 路徑。一個 Zig 背景執行緒會讀取 PTY 輸出並非同步地更新終端機狀態。只有在需要重新繪製或特定的回調(例如 OSC 處理程序)時,才會通知 Emacs。這可以防止大型日誌流阻塞 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這樣的工具可以在 buffer 中直接顯示圖像。 - Synchronized Output (DEC 2026): 消除現代 TUI(例如 Claude Code)中斷斷續續的部分重新繪製。
- Rich Text Attributes: 支援五種類型的底線(單線、雙線、波浪線、點線、虛線)並具有獨立的顏色,以及淡化/變暗文本和刪除線。
- OSC 8 Hyperlinks: 原生支援終端機程序產生的可點擊 URL。
- Color Queries: 支援 OSC 4/10/11,允許 TUI 程序自動檢測 Emacs 主題的淺色/深色模式。
輸入模式與用戶體驗
Ghostel 實現了五種不同的輸入模式,以平衡終端機控制與 Emacs 生產力:
- Semi-char mode (預設): 大部分按鍵都會傳送到終端機,但少數按鍵(例如
C-x,M-x)會保留給 Emacs。 - Char mode: 所有按鍵都會轉發到終端機;用於那些會綁定保留 Emacs 按鍵的 TUI。
- Emacs mode: Buffer 變為唯讀視圖。終端機繼續運行,但用戶可以使用標準的 Emacs 導航與搜尋,而不會影響 shell。
- Copy mode: 與 Emacs mode 類似,但終端機被凍結,提供一個穩定的快照以進行精確的文本選擇。
- Line mode: 輸入會在 Emacs 中進行本地緩衝,以便進行完整的編輯(使用 Emacs 按鍵),並在按下
RET時原子性地發送到 shell。
深度 Emacs 整合
Ghostel 透過橋接 shell 與編輯器之間的差距來擴展終端機體驗:
- 密碼提示檢測: Ghostel 會檢測程序(例如
sudo或ssh)何時請求密碼。它會開啟一個原生的 Emacsread-passwd提示,確保密碼不會進入view-lossage或鍵盤宏錄製中。 - 從 Shell 調用 Elisp: 透過一個白名單系統 (
ghostel-eval-cmds),shell 腳本可以觸發 Emacs 函數。例如,可以創建一個 shell alias 來透過ghostel_cmd dired-other-window "$(pwd)"在 Dired 中開啟當前目錄。 - TRAMP Support: Ghostel 與 TRAMP 整合以支援遠端終端機。它包含針對遠端主機上的
xterm-ghostty的自動化 terminfo 安裝,以確保遠端 TUI 能保持高保真度的渲染。 - Compilation Mode:
ghostel-compile提供了一個基於 TTY 的M-x compile替代方案,允許需要真實 TTY(為了顏色或進度條)的程序運行,同時保持compilation-mode的 UX 用於錯誤導航。
社群洞察
早期採用者報告稱 Ghostel 是一個可行的日常使用工具,儘管仍有一些細節需要完善。用戶強調了在摘要中點擊代碼引用以直接在 Emacs buffers 中開啟它們的實用性。然而,一些用戶也注意到偶爾會出現終端機清除或罕見的凍結情況,這表明雖然性能是突破性的,但該項目仍處於成熟階段。
"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)