你肯定遇到过这个场景:SSH 登上一台老服务器,按下退格键,屏幕上蹦出一串乱码方块;tput 报「未知终端类型」;vim 的配色变成一锅灰。问题不在服务器,也不在你的 shell,而在一个几十年没人认真解决的历史包袱——服务器上没有你本地终端的 terminfo 定义,远程程序根本不知道你的终端支持什么。
10 月 27 日发布的 Ghostty 1.4 给了这个场景一个干脆的答案,而且远不止于此。这个由 HashiCorp 联合创始人 Mitchell Hashimoto 主导、用 Zig 编写的 GPU 加速终端,用七个月、172 位贡献者、2889 个提交换来了 1.4 这个版本,发布当天就以超过 1200 分登顶 Hacker News。我通读了官方那份号称「人工写了 16 个小时以上」的发布说明,挑出真正影响日常使用的部分,以及升级前必须知道的坑。
先看硬数字:快在哪里,省在哪里
终端模拟器这种工具,「快」很难感知,直到你一次 cat 一个 150MB 的日志文件。官方自测数据里最扎眼的是 ASCII 解析吞吐从 128MB/s 提到 725MB/s,约 5.7 倍;在 macOS 上 cat 一个 150MB 文本文件的耗时从 1.5 秒降到 566 毫秒。pty 输入输出吞吐在 M4 Max 上提升了 25% 到 55%,启动到窗口显示快了约 15%,首帧渲染提前了约 27%。
| 指标 | 变化 | 幅度 |
|---|---|---|
| ASCII 解析吞吐 | 128MB/s → 725MB/s | 约 5.7 倍 |
| cat 150MB 文本(macOS) | 1.5s → 566ms | 约 2.6 倍 |
| pty I/O 吞吐(M4 Max) | — | 提升 25-55% |
| 滚动缓冲物理内存 | 默认开启压缩 | 降低 70-90% |
| 每个新终端内存(macOS) | 128KiB → 约 16KiB | 约为原来八分之一 |
| 20 个隐藏标签页 GPU 内存(macOS) | 约 385MiB → 约 18MiB | 约为原来二十分之一 |
| Kitty 图像传输解析(64MiB,x86_64 Linux) | 未给出基线 | 约 16 倍 |
| 大尺寸 OSC 序列解析 | 未给出基线 | 约 30 倍 |
| 大滚动缓冲下调整窗口尺寸 | 未给出基线 | 约 6 倍 |
这些数字是官方自测而非第三方复现,要打折看,但方向很清楚:重负载输出场景的瓶颈在逐个消失。
对普通用户体感最强的是滚动缓冲压缩。1.4 在 macOS 和 64 位 Linux 上默认开启,顺带把缓冲上限从 10MB 提到 50MB——存得更多,占的物理内存反而少了七到九成。对跑 AI Agent 的人来说这是实打实的红利:Agent 动不动刷出几万行日志,以前开三个长会话终端就开始喘,现在内存曲线平得多。还有一群隐形受益者是多标签重度用户:20 个隐藏标签页的 GPU 占用从约 385MiB 压到约 18MiB,意味着标签页开着不干活时几乎不碰显卡资源。
终端里能放动画了:Kitty 图形协议 100% 补齐
这大概是 1.4 最有传播相的特性。Kitty 图形协议允许命令行程序直接在终端里显示像素级图像,而 Ghostty 1.4 补上了最后两块拼图:动画和相对定位。用 kitten icat 显示一张动图,以前只能看到静止的首帧,现在会真正动起来;终端不可见时动画自动暂停,不白烧 GPU;相对定位则让一张图可以挂在另一张图的定位点上,子图跟着父图移动,拼出复合画面。
Ghostty 因此成为第一个 100% 实现公开 Kitty 图形协议的非 Kitty 终端。注意措辞是「公开协议」加「非 Kitty」——这个领域长期是 Kitty 一家的自留地,其他终端要么不支持,要么只支持静态图。官方这次还做了一轮完整的一致性比对,修了几十个行为差异:图片现在会跟着滚动区域里的文字一起滚动,重传同一个图像 ID 会正确替换旧图,非法图像数据也有了明确的报错路径。
配套数据是 Linux x86_64 上 64MiB 图像传输的解析速度快了约 16 倍。图像协议这种看似小众的炫技值得单独一节,因为它正在变成基础设施:越来越多的 TUI 工具、监控面板、甚至 AI 编程助手的差异预览,都在往终端里塞图像。协议实现得越是完整,上层工具敢用的能力就越多。
同一批协议工作里还有一件不那么起眼的事:Ghostty 1.4 支持了 Kitty 剪贴板协议,也就是 OSC 5522。它允许终端里的程序以受控方式读写系统剪贴板,配合新增的剪贴板写字节上限设置,默认 64MiB。对普通用户这是无感的管道,对终端应用的作者则是又一条不用绕路的数据通道。
ghostty +ssh:一条命令终结 terminfo 乱码
回到开头那个场景。传统修法是在服务器上手动安装 terminfo,或者用 infocmp 导出再传过去,繁琐到大多数人选择忍着。Ghostty 1.4 的做法是包一层:用 ghostty +ssh 代替 ssh 命令,它会自动把 terminfo 装到远端,并转发必要的环境变量。
ghostty +ssh user@your-server
就这一行。它是一个可以直接替换 ssh 的包装器,连参数习惯都不用改,远端装好 terminfo 之后,退格、配色、全屏程序全部恢复正常。对每天要在十几台机器之间跳来跳去的运维和平台工程师,这条命令省下的不是几分钟,而是那种「每次都要排查一遍环境」的心智磨损。官方还顺手修了缓存管理,新加了一个按天数清理旧缓存的开关,比如清理 30 天前的记录。
顺带要说,这次的安全修复里有一条正好和终端使用场景相关:zsh 集成此前存在一个漏洞,只要 cd 进一个目录名被精心构造的目录,比如一个克隆下来的恶意仓库,就可能被注入任意转义序列,包括通过 OSC 52 静默改写你的剪贴板。1.4 把它修掉了。这类攻击可怕在触发条件极其日常——只是进个目录而已,不需要你执行任何可疑命令。
十个安全公告:终端是被低估的攻击面
翻开发布说明的安全章节,密度有点惊人:一个版本修了十个安全公告。除了上面那条 zsh 集成问题,还有几个值得知道。
粘贴保护此前没把回车符当作行结束符,在不用 bracketed paste 的程序里,一次粘贴可能不经确认就执行命令。恶意的 Kitty 图形命令可以让 Ghostty 崩溃、挂死、强制巨额内存分配,在有限情况下甚至能读取或删除允许目录之外的文件,触发条件仅仅是显示了恶意输出。通过 tmux 控制模式构造的输出可以让整个 Ghostty 崩溃并关掉所有窗口,系统上根本不需要装 tmux,影响 1.3.0 和 1.3.1 两个版本。macOS 上 Cmd 点击精心构造的 OSC 8 超链接,可能打开不安全的本地文件或自定义协议,导致任意命令执行。拖拽文本进终端此前会绕过粘贴保护,危害与粘贴那条相同。还有两个更偏门的:清屏进滚动缓冲在极小的缓冲配置下可能损坏内存,文件名里藏控制字符可以让确认对话框显示的命令和实际执行的命令不是同一个。
值得玩味的是官方的一句坦白:这些公告的 CVE 编号几周前就申请了,GitHub 还没分配下来。终端是开发者每天盯着最久的窗口,也是最少被当成攻击面的窗口——它解析的每一个转义序列,都可能来自不可信的输出。
升级前必看:默认值改了,别直接覆盖安装
1.4 有几处破坏性行为变更,不看配置直接升级,会遇上「选中文字突然不复制了」这类摸不着头脑的变化。
| 变更项 | 旧行为 | 新行为 | 应对 |
|---|---|---|---|
| copy-on-select 取 clipboard 时 | 同时写系统剪贴板和 primary | 只写系统剪贴板 | 想恢复旧行为改用 both |
| macOS copy-on-select 默认值 | primary | none | 手动设回 primary |
| macOS cmd 加上下方向键 | 可自定义 | 重新绑定为 jump_to_prompt | 检查与自己的键位冲突 |
| GTK ctrl+shift+page 键 | jump_to_prompt | 改为 move_tab | jump 挪到方向键 |
| scrollback-limit 配置名 | 旧名 | 改名 scrollback-limit-bytes | 旧名仍兼容,建议换 |
一份保住 1.3 手感的过渡配置长这样:
# ~/.config/ghostty/config
copy-on-select = primary
scrollback-limit-bytes = 52428800
scrollback-compression = true
keybind = cmd+shift+n=move_tab_to_new_window
平台门槛也要先看清楚:macOS 最低要求 13 Ventura;Linux 和 FreeBSD 需要 GTK 4.18 加 libadwaita 1.7,外加支持 OpenGL 4.3 的 EGL 环境,因为 GTK 侧换上了新的三重缓冲渲染器,顺带修好了真正的小数缩放。Ubuntu 24.04 LTS 不满足这个 GTK 版本要求,官方建议是留在旧版或者改用 Flatpak。从源码编译的话,Zig 必须是 0.17。
Linux 和 FreeBSD 用户这一版还白捡一个新渲染器。GTK 侧彻底换掉了旧绘制路径,改为基于 OpenGL 和 EGL 的新渲染器,三重缓冲,并且第一次支持了真正的小数缩放——此前因为上游改动,非整数缩放下字体发虚的问题一并解决。分屏操作也终于补上了拖拽:鼠标移到分屏上沿会出现一个三点把手,拖住它可以把整个分屏拖到另一个分屏、另一个标签页甚至另一个窗口里,正在运行的程序、输出内容和当前工作目录都会原样跟着走。
新版本还塞了一批小改进:GTK 侧支持了横向滚动标签栏和窗口重命名,macOS 的命令面板加了模糊搜索,退出前多了窗口检查流程,本地化新增了巴斯克语、白俄罗斯语、丹麦语和塞尔维亚语四种。这些单拎出来都不值一提,凑在一起就是「维护团队在认真打磨」的信号。 终端仿真层面也补了 DECSTR、DECBKM 等一批模式支持,GTK 还通过 vicinae-hotkey-v1 协议拿到了全局快捷键能力。
谁该马上升,谁该等一等
马上升的人群很明确:经常 SSH 上老服务器的人,ghostty +ssh 一条就值回票价;常年开几十个标签页、或跑多个 Agent 长输出任务的人,内存收益立竿见影;已经用上 macOS 27 的人,1.4 修掉了标签栏灰条等一批视觉毛病。
等一等也不丢人:Ubuntu 24.04 LTS 用户,GTK 版本不够,要么 Flatpak 要么留在旧版;重度自定义 copy-on-select 和键位的人,先把上面的表对一遍再动手;macOS 12 及更早的系统已经不在支持范围。如果你在 iTerm2 上深度依赖图形设置界面和 tmux 集成,或者在 WezTerm 上写了一大堆 Lua 自定义,也没必要为了新特性搬家——终端是肌肉记忆的工具,切换成本不该被低估。
还有一群人不用再等了:指望官方 Windows 图形界面的人。这次官方明确把 Windows GUI 从路线图里撤了,立场是核心库 libghostty 完整支持 Windows 且有 CI 覆盖,想要 Windows 终端的下游项目应该基于 libghostty 自己做。
还有一个容易被忽略的背景:Ghostty 是非营利项目,发布说明里专门留了财务更新章节,捐款几乎全部直接付给贡献者。一个终端模拟器能把 172 位贡献者组织进七个月的开发周期,靠的不是商业预算而是社区共识。
这个态度很能代表 Ghostty 的项目性格:不铺摊子,把核心引擎做成别人能用的零件。已经有 cmux 这类面向 AI Agent 的终端直接构建在 libghostty 之上——Agent 时代的终端不只是人机界面,也是进程的容器,底层引擎的收益会顺着生态传导。发布节奏保持六个月一个版本,1.5 排在 2027 年 3 月。七个月换 5.7 倍解析速度、七成以上的内存降幅和一个终于不再折腾的 SSH,这次升级,多数人不该错过。