Hacker News 中文摘要

RSS订阅

Ghostel.el:基于libghostty的终端模拟器 -- Ghostel.el: Terminal emulator powered by libghostty

文章摘要

Ghostel是一个基于libghostty的终端模拟器,支持Emacs集成,提供快速启动、Shell集成、多种输入模式等功能,可通过MELPA或手动安装。

文章总结

好的,这是根据您的要求,对原文主要内容进行的中文重述,已保留关键细节并删减了与主题无关的目录、导航等元素。


Ghostel:一款由 libghostty 驱动的 Emacs 终端模拟器

Ghostel 是一款 Emacs 终端模拟器,其核心 VT 引擎采用了与独立终端应用 Ghostty 相同的 libghostty-vt。它采用双层架构:一个用 Zig 编写的原生动态模块负责处理终端状态、渲染和本地 PTY 的 I/O 操作;而 Elisp 部分则负责管理按键映射、缓冲区、命令以及与远程进程的集成。

Ghostel 的设计灵感来源于 emacs-libvterm,并遵循其双层设计模式,但使用了更现代的 Ghostty VT 引擎。这使其支持了许多 libvterm 所不具备的功能,例如 Kitty 键盘和图形协议、丰富的下划线样式、OSC 8 超链接、OSC 4/10/11 颜色查询以及同步输出 (DEC 2026)。

快速上手

在 Emacs 中,通过 M-x ghostel 即可打开一个终端。原生模块会在首次使用时自动下载,因此通常无需配置工具链。

核心特性

  • 终端模拟:提供完整的 VT 终端模拟,支持 256 色和 24 位真彩色。默认设置 TERM=xterm-ghostty 并附带 terminfo 文件,使应用程序能发现并利用其高级特性,如同步输出和 Kitty 键盘协议。
  • 输入模式:提供五种类似 eat.el 的输入模式,以适应不同的操作场景。
    • 半字符模式 (默认):大部分按键直接发送到终端,保留 C-cC-x 等少数 Emacs 快捷键。
    • 字符模式:所有按键都发送到终端,适用于需要绑定 C-x 等键的 TUI 应用。
    • Emacs 模式:终端保持运行,缓冲区变为只读,允许用户使用 Emacs 的搜索、导航功能浏览输出,而不会误触终端。
    • 复制模式:终端输出被冻结,方便用户精确选择文本,而不会被持续的输出干扰。
    • 行模式:类似 M-x shell,用户可以在 Emacs 中编辑整行命令,按 RET 后一次性发送到终端。
  • Shell 集成:自动为 bash、zsh 和 fish 注入集成脚本,无需手动修改配置文件。支持目录追踪 (OSC 7)、提示符导航 (OSC 133) 和标题追踪 (OSC 2)。
  • 链接与文件检测:支持 OSC 8 超链接,并能自动检测并链接纯文本 URL 和 文件:行号 格式的路径。
  • 内联图像:支持 Kitty 图形协议,可在终端内显示图像,适用于 timgyazi 等工具。
  • 密码提示检测:当 sudossh 等程序请求密码时,会弹出 read-passwd 对话框,密码不会经过 Emacs 的按键记录系统,增强了安全性。
  • 从 Shell 调用 Elisp:通过 ghostel_cmd 命令,可以在 shell 脚本中调用白名单内的 Emacs Lisp 函数。
  • 通知与进度:支持 OSC 9 和 OSC 777 桌面通知协议,以及 ConEmu 的进度报告协议 (OSC 9;4)。
  • 远程终端 (TRAMP):支持通过 TRAMP 在远程主机上打开终端。可以自动或手动配置远程 shell 集成和 terminfo,以确保 xterm-ghostty 在远程也能正常工作。
  • 性能:通过 Zig 原生模块处理 PTY I/O,性能显著优于纯 Elisp 的 eat 和基于 C 的 vterm。在基准测试中,处理纯 ASCII 文本的吞吐量约为 75 MB/s,是 vterm (18 MB/s) 的 4 倍,eat (6.2 MB/s) 的 12 倍。其原生 PTY 路径能异步处理大量输出,避免阻塞 Emacs 主线程。

扩展功能

  • Evil 模式:通过独立的 evil-ghostel 包提供支持,使终端操作与 Vim 风格的按键绑定无缝集成。
  • 编译模式ghostel-compile 模块允许在 Ghostel 终端中运行编译命令,并像 M-x compile 一样提供错误导航功能,同时保留了 TTY 的特性(如彩色输出)。
  • Eshell 集成ghostel-eshell 模块让 Eshell 中的“可视化”命令(如 vim、htop)在 Ghostel 缓冲区中运行,获得更好的终端模拟体验。
  • Comint 集成ghostel-comint 模块可以替换 M-x shell 等 comint 缓冲区的 ANSI 过滤器,提供更精确的 SGR 渲染和 OSC 8 超链接支持。

架构

Ghostel 采用双层设计:Zig 原生模块是终端引擎,负责 VT 解析、渲染和本地 PTY 管理;Elisp 层负责与 Emacs 的集成,包括按键映射、缓冲区管理和命令处理。渲染器负责在更新缓冲区时,妥善保存 Emacs 的点和窗口位置,确保 Elisp 代码可以像操作普通缓冲区一样操作终端缓冲区,而无需担心渲染过程带来的位置变化。

总结

Ghostel 是一个功能丰富、性能卓越的 Emacs 终端模拟器。它通过采用现代 VT 引擎,提供了许多其他 Emacs 终端所不具备的先进特性,同时保持了良好的用户体验和扩展性。对于需要在 Emacs 中获得强大终端体验的用户来说,它是一个极具吸引力的选择。

评论总结

根据评论内容,总结如下:

主要观点与论据:

  1. 性能与体验提升(评论1、2、3):Ghostel相比vterm更快,能流畅运行刷新全屏的TUI应用,输入处理更可靠,ELisp API更友好。评论2称其与Claude code集成后,显著改变了Emacs使用方式,成为工作中心。评论3(维护者)强调,终端文本像普通Emacs缓冲区,支持滚动搜索、键盘导航和复制,比外部终端更高效。

    • 关键引用:评论1 "noticeably faster (e.g. fancy TUI apps that try to refresh the whole terminal every frame actually work)"
    • 评论2 "This is working great, it plus the Claude code integration has really adjusted how much I use Emacs"
  2. 存在缺陷(评论1):有时无法正确清除终端,在提示行前留下垃圾内容;偶尔完全冻结,只能杀死缓冲区重启。评论1认为它可作为日常驱动,但需打磨和修复才能成熟。

    • 关键引用:评论1 "Sometimes it fails to properly clear the terminal, leaving junk at the top of the buffer"
    • 评论1 "on a couple of occasions it has totally frozen, with no fix other than killing the buffer"
  3. 维护者回应与功能对比(评论3):Ghostel基于libghostty-vt,提供与vterm、eat的对比页面和性能/正确性测试。维护者表示已完全替代vterm/eat和外部终端(如kitty/Ghostty),并邀请用户反馈缺失功能或使用外部终端的原因。

    • 关键引用:评论3 "it has not only replaced vterm/eat but also any other external terminal like kitty/Ghostty"
    • 评论3 "Having your terminal text just like a normal Emacs buffer opens up so many possibilities"
  4. 对预构建二进制文件的质疑(评论4):评论4对“原生模块是预构建二进制,首次使用自动下载”的做法提出疑问,认为应将其作为发行版的一部分。

    • 关键引用:评论4 "Why? Keep it a part of distribution."

平衡性总结:评论整体对Ghostel持积极态度,认可其性能提升和Emacs集成优势,但指出存在清除和冻结等稳定性问题。维护者积极回应并邀请反馈,同时有用户对分发方式提出改进建议。