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 图形协议: 支持通过 Emacs 内置的图像支持渲染的内联图像(PNG, RGB, RGBA)。这允许
yazi或timg等工具直接在 buffer 中显示图像。 - 同步输出 (DEC 2026): 消除了现代 TUI 在部分重绘时的卡顿感(例如 Claude Code)。
- 丰富的文本属性: 支持五种类型的下划线(单线、双线、curly、dotted、dashed)并带有独立颜色,以及淡化/暗淡文本和删除线。
- OSC 8 超链接: 原生支持终端程序生成的、可点击的 URL。
- 颜色查询: 支持 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 与编辑器之间的鸿沟,扩展了终端体验:
- Password Prompt Detection (密码提示检测): Ghostel 会检测程序(如
sudo或ssh)何时请求密码。它会打开一个原生的 Emacsread-passwd提示框,确保密码不会进入view-lossage或键盘宏录制。 - Calling Elisp from Shell (从 Shell 调用 Elisp): 通过一个白名单系统 (
ghostel-eval-cmds),shell 脚本可以触发 Emacs 函数。例如,可以创建一个 shell alias 来通过ghostel_cmd dired-other-window "$(pwd)"在 Dired 中打开当前目录。 - TRAMP Support (TRAMP 支持): Ghostel 与 TRAMP 集成以支持远程终端。它包含针对远程主机上
xterm-ghostty的自动化 terminfo 安装,以确保远程 TUI 保持高保真渲染。 - Compilation Mode (编译模式):
ghostel-compile为M-x compile提供了一个基于 TTY 的替代方案,允许需要真实 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 toolchain。
(use-package ghostel
:ensure t)