Ghostty 1.2.0

Ghostty 1.2.0 的发行说明,发布于 2025 年 9 月 15 日。

Ghostty 1.2.0 由 149 位贡献者 在 2,676 个提交 中完成,历时6 个月。感谢所有为本次发行做出贡献的贡献者、维护者、社区管理员、翻译者、打包者与用户。本发行版对 Ghostty 的每个部分都做了重大改进,包括数百个 bug 修复。

安全

  • macOS:GHSA-q9fg-cpmh-c78x。修复了 Ghostty 可被用作来自其他易受攻击或恶意来源的提权跳板的问题。这需要 Ghostty 之外的一个易受攻击的应用发起这一连串事件。因此,这被视为低风险通告。

亮点

新应用图标

PR:#7638 #8038

在 macOS 上,Ghostty 1.2 附带了一个新的 macOS Tahoe 兼容图标,如下所示。该图标用新的 Icon Composer 应用构建,允许图标配合所有新的 macOS 浅色、深色、半透明与自定义着色样式。

在 GTK(Linux 与 FreeBSD)上,Ghostty 1.2 附带了一个新的图标,更好地匹配 许多 桌面环境。我们选择与 GNOME 风格保持一致,因为它常见且在大多数环境下不会显得格格不入。

Note

由于桌面环境多种多样,为 Linux 与 BSD 生态做一个完美的、全局一致的图标是不可能的。我们相信这个图标在更多环境下比之前的图标更好看, 并且避免了之前那个图标暴露出的"以 macOS 为中心"的负面反应。

命令面板

PR:#7153 #7156

Ghostty 现在有一个命令面板,可以调用大多数 keybind 动作,如新建终端、移动焦点、更改文本选区、复制粘贴等。

命令面板默认绑定 GTK 上的 ctrl+shift+p 与 macOS 上的 cmd+shift+p。可以用 toggle_command_palette keybind 动作重新绑定到任何键位绑定。命令面板在 macOS 与 GTK 上也都可以通过菜单栏使用。

命令面板暴露几乎每一个可用的键位绑定。当 Ghostty 新增新的 keybind 动作时,它们也会自动出现在命令面板中。这带来一些立即可见的好处,即你可以访问未绑定到 keybind 的 keybind 动作。这对不常使用的动作很有用。

例如,我自己就经常通过命令面板使用 move_tab 动作,但频率低到不值得专门绑定。

在 Ghostty 的未来版本中,我们会继续扩充命令面板中的可用特性。例如,我们正在开发一个新的终端序列规范,允许终端程序把它们的动作直接暴露在命令面板中(想象一下 Neovim 命令完全可用在命令面板中)。

Quick Terminal 大小

PR:#2384

新配置 quick-terminal-size 现在可以配置 quick terminal 的默认大小。这是呼声最高的特性之一。

quick-terminal-size 配置同时支持百分比与像素大小。如果你只指定一个值,它指定主轴的大小(取决于位置)。如果指定两个值,则第二个值是次轴。下面的例子说明这一点:

# Percentage, primary axis only
quick-terminal-size = 25%

# Pixels work too, primary axis only
quick-terminal-size = 600px

# Two values specify primary and secondary axis
quick-terminal-size = 25%,75%

# You can also mix units
quick-terminal-size = 300px,80%

主轴 由 quick-terminal-position 配置定义。对 top 与 bottom 值,主轴是高度。对 left 与 right 值,主轴是宽度。对 center,取决于你的显示器方向:横向为高度,纵向为宽度。

不只是指定大小,quick terminal 现在可以在运行时调整大小,并会在 Ghostty 运行期间记住该尺寸。在之前的版本中大小是固定的,这在不同显示器大小与分辨率下造成了真实问题。

带两个示例的 GTK 截图如下:

SSH 改进(进行中)

PR:#7608

Ghostty 现在提供可选的 shell 集成特性,使 Ghostty 对尚未更新以支持 Ghostty 的 terminfo 的远程 SSH 机器更具兼容性。

新的 ssh-env 可选特性会自动把 TERM 变量设为 xterm-256color(并转发一些其他环境变量,使会话工作更好)。虽然并不严格正确,但这种创可贴方案在大多数情况下利大于弊。

新的 ssh-terminfo 可选特性会自动把 Ghostty terminfo 复制到远程机器,以便可以使用恰当的 xterm-ghostty TERM 设置,远程程序可以充分利用 Ghostty 的所有特性(并避免我们不支持的 xterm 特性)。

这两个特性都是可选的,因为它们要求在你的 shell 中覆盖 ssh 命令。这个操作并非没有风险,所以我们希望用户明白自己在做什么。我们尽力使其稳定可靠,但总有我们无法顾及的边缘情况。因此,这仍然在进行中,欢迎反馈。

渲染器重构

PR:#7620

渲染器后端被重构成共享同一套核心逻辑,无论是用 OpenGL 还是 Metal 渲染。这一变更将允许未来对该领域代码的更快改进,也有助于确保两个后端间的特性对等,这在许多特性为 Metal 实现却没有为 OpenGL 实现时,已经快要变成一个问题。

在重构过程中,OpenGL 后端获得了多项改进,现在应当更高效,并接近与 Metal 后端的特性对等。

这意味着 Linux 用户现在会看到正确的线性 alpha 混合,消除了某些背景色与前景色组合下文字边缘出现的伪影。Linux 上默认的 alpha-blending 配置值现在是 linear-corrected,它执行线性混合并对文字应用校正步骤,使文字的视觉粗细符合人们习惯的非线性混合。

这次重构还使自定义 shader 支持热重载。

自定义光标 Shader

PR:#7648

自定义 shader 现在会获得关于终端光标的信息,因此可以对其应用自定义效果与动画,比如拖尾或涂抹。

下面的例子展示了一个“光标拖着火花的 shader”,在光标移动时在其身后留下拖尾:

光标 shader 与自定义 shader 不适合所有人,但社区的 shader 创意令人惊叹。很多人玩得很开心,而且除了单纯的好看,它们也可能非常实用,例如让移动的光标更容易追踪(不过别太吵)。

我们最终还是计划加入一个第一方动画光标,以让用户不需要为拥有一个更易追踪的光标而承担自定义 shader 的性能开销,但把它做进自定义 shader 是一个简单的权宜之计。此外,即使加入第一方动画光标之后,这仍然有用,因为有些用户可能仍想要内置选项无法做到的非常特定的自定义效果。

终端背景图像

PR:#3645

你现在可以用 background-image 配置为终端指定背景图像。此外还有一组其他配置,让图像呈现成你喜欢的样子: background-image-opacity、background-image-position、 background-image-fit 与 background-image-repeat。

Warning

在 Ghostty 1.2.0 中,背景图像会在 VRAM 中为每个终端复制一份。对足够大的图像和很多的终端,这可能导致内存用量(具体说是 VRAM)大幅增加。未来版本的 Ghostty 将让图像纹理在终端间共享,以回避该问题。

图形进度条

PR:#7975 、#8477

Ghostty 现在能识别 ConEmu OSC 9;4 序列并渲染一个 GUI 原生进度条。

据我们所知,Ghostty 是 macOS 上第一个支持该特性的终端模拟器。Linux 与 Windows 上除 Ghostty 外的多个终端已经支持该特性。

进度条可以显示成功/错误状态、向完成的进度数字、不确定进度(脉冲),等等。Amp 这类程序已经在使用进度条来展示活动,如下所示:

图形进度条现在被 Windows、Linux 与 macOS 上的多个终端支持,还被 systemd 与 Zig CLI 等主流终端程序支持。我们希望通过这些逐渐增长的终端支持,能让更多程序开始使用该特性。

今天,Ghostty 在终端顶部显示一个简单、基础的进度条。在未来版本中,我们会把进度扩展到标签页标题、任务条、Dock 图标等处。

Note

进度报告 OSC 9;4 序列与 iTerm2 通知序列冲突。Ghostty 是唯一同时支持这两种序列的模拟器。为了处理这一点,OSC 9;4 总是解析成进度报告,也就是说你不能发送以 ;4 开头当作通知的任何通知。我们认为这是一个合理的权衡——考虑到极其特定的文本,以及被更广泛推荐使用的 OSC 777 通知序列。

回退字体大小调整

PR:#7840 、#7953

当为 Ghostty 配置的字体没有我们需要渲染的字符的字形时,我们会在系统上找有该字形的字体。这些字体现在会在尺寸上被调整以更好地匹配主字体。这类似(但不等于)CSS 中的 font-size-adjust。

这有助于补偿字体尺寸的差异,营造整体更一致的外观。这对使用多种书写系统的用户特别有帮助——例如,CJK(中日韩)文本现在避免了字符之间出现大的纵向“裂缝”。

Ghostty 1.1.3(旧)Ghostty 1.2.0(新)

上面的例子差异微妙。当一行里用上多种不同字体时差异更明显。为确保走的是正路,我们还在社区调查了多位中文读者的反馈,反馈强烈偏向新的行为。

未来,我们计划重做字体配置,让你能按字体各指定尺寸,或让被配置的字体像回退字体一样被自动调整。

新增大量内建字形

PR:#7732 、#7755 、#7761

很多新字符现在由 Ghostty 直接绘制,而不是依赖字体提供。我们直接绘制字形,以确保它们与单元格相互对齐。

下面是新版支持字形的一小部分示例。注意字形沿单元格边缘完美对齐,中间没有空隙。这种像素对齐的渲染对使用此类字形的 TUI 应用很重要。

Ghostty 1.1.3(旧)Ghostty 1.2.0(新)

内建 Nerd Font 改进

PR:#7809 及若干修复次要问题的 PR

内建的 Nerd Font 符号现在由一个独立的 symbols-only 字体提供,而不再是 Regular、Bold、Italic 与 Bold Italic 四种样式的打过补丁的 JetBrains Mono;内建的 JetBrains Mono 现在使用可变字体而不是 4 个静态字体。这使 Ghostty 内嵌字体占用的空间比过去显著减少。

这也意味着我们现在使用的是更新版本的 Nerd Fonts symbols 拷贝,因此较新的符号也能正确渲染。

然而更大的变化是:Ghostty 现在会自动缩放 Nerd Fonts 符号以匹配单元格大小,与官方 Nerd Fonts patcher 的做法相同——这意味着在 Ghostty 中使用普通未打补丁字体的体验,应当与之前使用打过补丁字体的体验几乎或完全一致。

这意味着在 Ghostty 中现在 没有理由 使用打过补丁的字体,因为无论哪种方式,powerline 字形都会为单元格大小正确缩放。

键位绑定重构

PR:#7320

基于 W3C key event code 规范,我们重构了键位绑定使其更一致。这项工作应当让键位绑定跨操作系统与键盘布局更稳定可预测,同时也伴随 可能破坏现有键位绑定的重大行为变更。

所有单码点字符现在匹配键盘布局产生的字符(即随布局变化)。因此 ctrl+c 匹配美式标准键盘布局上物理的 "c" 键,但在 Dvorak 布局上匹配 "i" 键。对国际字符同样如此。码点的大小写不敏感,通过 Unicode 大小写折叠匹配(Windows 与 macOS 处理键盘快捷键就是这样做的)。

所有其他键名匹配物理键,键名按 W3C key codes 命名。例如:ctrl+KeyA 总是匹配美式物理布局上的 "a" 键(该 KeyA 键名与美式键盘对应是规范强制要求的,不是我们定的)。注意这里的 "物理" 指 OS 或 GUI 框架发送的 keycode;"硬件" 层级的重映射程序可以覆盖它,但软件布局不这样做。

因此,**physical: 前缀已被移除。**物理 keybinds 现在通过上述多码点键名显式表示。之前的 physical: keybinds 继续有效,但应更新为新格式。

为了保证向后兼容,Ghostty 中所有不匹配 W3C 的既有键名都映射到其 W3C 等价物。例如,grave_accent 映射到 backquote。

终端响铃

PR:#7099 、#5326 、#7087 、#7101 、#7118 、#7148 、#7842 、#7533

macOS 与 GTK 上的 Ghostty 都支持终端铃声(ASCII BEL 或 0x07)。铃声响起时 Ghostty 的行为可以用 bell-features 配置定制。我们默认的设置是最不打扰人但仍有用的,可选的更吵设置可以通过 bell-features 开启。

在 macOS 上,铃声默认会把铃铛 emoji(🔔)放到终端的标题里,Dock 图标会弹跳一次,并在 Dock 与应用切换器里的 Ghostty 图标上加上一个徽标。不播放任何声音。

在 GTK 上,铃声默认会把铃铛 emoji(🔔)放到终端的标题里,并标记窗口为请求关注。"请求关注" 的确切行为由窗口管理器或桌面环境决定。不播放任何声音。

GTK 还支持默认关闭的音频铃声特性,可以用 bell-features=audio 启用。你甚至可以用 bell-audio-path 配置指定自定义音频来播放。bell-features=system 特性(默认关闭)会使用 "系统提示音",它通常也可以发声,通过中央系统设置配置。

GTK 还支持一个边框闪烁动画,可以用 bell-features=border 启用。这类似其他终端模拟器提供的 "visual bell" 特性。

未来版本的 Ghostty 将把 macOS 带到所有铃声特性上的对等位。

终端模拟兼容性

Ghostty 1.2 包含数十项核心终端模拟的改进,以使终端程序在 Ghostty 中的工作方式与在其他终端模拟器中一致且正确。相关变更的完整列表见terminal capabilities一节。

这些改进的范围从非常小(#7443 ,任何野外已知程序都不使用的序列)到非常重要(#8590 ,破坏了一些真实程序)。无论如何,Ghostty 非常认真地对待终端模拟兼容性,我们努力确保 Ghostty 可以支持现存的广泛的终端特性。

把这件事做对非常说难也难:终端模拟功能中只有极小的子集有正式规范,绝大多数由基于终端模拟器实际行为的事实标准定义。此外,由于不存在单一的标准组织,协议之间经常互相冲突,而我们只能判定哪个协议更重要或如何折中同时支持两者。

例如,进度条序列与 iTerm2 桌面通知序列冲突。作为折中,任何无歧义的进度条序列优先于通知,因此如果你想发送一条内容恰好是该进度条序列的通知,是不会工作的。这是 Ghostty 为能成为几乎唯一同时支持进度条与 iTerm2 桌面通知的终端而做出的折中。1

macOS:Tahoe 支持

Ghostty 1.2 增加了对 macOS 26 (Tahoe) 的支持。

在 macOS 26 上运行时,Ghostty 会使用新的 Liquid Glass 风格。应用图标已更新以支持 macOS 26 特性,如浅色、深色、着色等。许多 UI 细节被更新以更好地匹配新的 macOS 风格,例如菜单栏中的图标。除视觉支持外,还修复了许多兼容性问题。

Ghostty 1.2 与之前的 macOS 版本保持完全兼容,向下一直支持到 macOS 13 (Ventura)。

Note

Ghostty 1.1.x 在 macOS 26 上可以运行。由于 macOS SDK 的工作方式,Ghostty 1.1.x 会使用旧的 Tahoe 之前的 UI 样式。仍存在一些兼容性问题,但如果你近期无法升级到 Ghostty 1.2,大体上是可用的。

macOS:撤销/重做关闭

PR:#7535

所有关闭终端的操作现在都支持撤销与重做,使用标准的 macOS 键位绑定(Cmd+Z 与 Cmd+Shift+Z,可以重新绑定)。这包括关闭分屏、关闭标签页、关闭窗口、关闭所有窗口、关闭其他标签页等。

撤销/重做的实现方式是让最近关闭的终端继续保持运行但隐藏,持续一段可配置的时间(默认 5 秒)。在这段时间内,你可以撤销关闭,终端会在与之前相同的位置重新打开。由于终端一直在运行,你确切的终端状态被恢复。

终端可以被撤销的时长可以用 undo-timeout 配置。

在 Ghostty 的未来版本中,我们计划支持撤销和重做的 GUI 更多交互,包括调整分屏大小、移动标签页等。

macOS:Apple 快捷指令

PR:#7634

macOS 上的 Ghostty 现在与 Apple 快捷指令集成。这使 Ghostty 可以在 macOS 上脚本化,尤其是与非 Ghostty 专属的快捷指令动作(如截屏、移动窗口等)组合使用时。

Apple Shortcuts 可以绑定到全局快捷键、跨设备同步,等等。这是一个非常强大的工具!

该特性不取代我们未来的完整跨平台 Ghostty API 计划。这个 macOS 专属特性确实覆盖了 macOS 用户这些用例,但我们仍计划在未来的版本中构建更多的脚本化选择。

GTK:Quick Terminal

PR:#4624

quick terminal 现在支持在 Linux 上运行于 Wayland 并可访问广泛支持的 wlr-layer-shell 协议。quick terminal 已作为特性在 macOS 上自 Ghostty 1.0 起可用。

提醒一下,"quick terminal" 是 Ghostty 的一个特性:一个单例的终端窗口可以用单个热键显示与隐藏,热键绑定到 toggle_quick_terminal(通常是一个全局热键,即使 Ghostty 未获得焦点也有效)。这有时也称为 "下拉终端" 或 "DOOM 风格终端"。

Linux 上的 quick terminal 完全支持标签页与分屏。

GTK:全局键位绑定

PR:#6051

GTK 应用现在支持全局 keybinds——即使 Ghostty 不是聚焦应用也能生效的键位绑定。这些键位绑定在 Ghostty 配置中用 global: 前缀定义。

全局 keybinds 需要系统安装了功能正常的 XDG desktop portal。Ghostty 的其他部分已经依赖 XDG desktop portal,所以它很可能已经存在。如果没有,通常只需要安装一个支持良好的包(加一次重启)。

全局 keybinds 支持任何键位绑定动作,但特别适合与 toggle_quick_terminal 这样的特性配合后者现在 也在 GTK 上受支持。

GTK:本地化(进行中)

PR:#6004 加上多到难以逐一列举的各语言贡献。

初步添加了 GTK 应用的本地化支持。目前只有 GTK GUI 元素被翻译。macOS 与 Ghostty 其他部分的本地化支持将在未来版本中提供。

Ghostty 1.2 对以下语言的 GUI 元素拥有完整的本地化:

  • bg_BG
  • ca_ES
  • de_DE
  • es_AR
  • es_BO
  • fr_FR
  • ga_IE
  • he_IL
  • hu_HU
  • id_ID
  • it_IT
  • ja_JP
  • ko_KR
  • mk_MK
  • nb_NO
  • nl_NL
  • pl_PL
  • pt_BR
  • ru_RU
  • tr_TR
  • uk_UA
  • zh_CN

本地化是各语言的志愿者完成的。Ghostty 项目极其感谢贡献时间本地化 Ghostty 的志愿者们。如果你想为你的语言本地化 Ghostty,请看 CONTRIBUTING.md 文档中的说明。

GTK:FreeBSD 支持

PR:#7606

Ghostty GTK 应用现在支持 FreeBSD。这项工作几乎完全由一位社区成员推动,他做了向我们的所有依赖提交补丁以支持 FreeBSD、更新构建脚本、以及协助自动化测试的辛勤工作,确保 Ghostty 在 FreeBSD 上持续可用。

除了 FreeBSD 上正确构建与运行外,社区还在开发一个 FreeBSD port 方便安装。当那个 port 可用时,我们会更新安装文档。

GTK:完整且无泄漏的重写

PR:#7961 、gtk-ng PRs

我们把整个 GTK 应用从零开始用完整的 GObject 类型系统重写了一遍。在这个过程中,我们用 Valgrind 测试了每一个特性,检查内存泄漏、未定义内存访问、use-after-free 等问题。

关键决策与成果见原始 PR,但结果是一个更稳定、更现代的 GTK 应用,对贡献者来说也更容易维护。

1.1.3 的 GTK 应用有一些已知的内存泄漏,要求在非常长的运行时间后重启 Ghostty。终端通常对许多开发者从不会被关闭,且不应有任何应用需要重启。GTK 应用现在完全稳定,tip 用户报告连续运行数周没有问题。

这并不只惠及 GTK 用户:作为这项工作的成果,我们现在为每次提交在 Valgrind 下运行所有 Ghostty 单元测试(#8309 )。我们超过 90% 的单元测试覆盖跨平台代码,所以这有助于确保整个 Ghostty 更稳定可靠。

Note

Valgrind 只能检测被实际执行的代码路径中的内存问题。我们测试了每一个可能的 GUI 交互,但没有测试 Ghostty 中每一个可能的代码路径。

系统需求

macOS: Ghostty 1.2 所需的最低 macOS 版本不变(macOS 13 Ventura)。Ghostty 现在与 macOS 26 (Tahoe) 兼容。

GTK: Ghostty 1.2 要求 GTK 4.14 与 libadwaita 1.5。这与我们的 GTK/Adwaita 版本策略一致。使用较旧 GTK 或 Adwaita 版本的系统可以通过使用旧版 Ghostty 或社区维护的 snap 或 flatpak 软件包绕过该要求。

破坏性变更

  • GTK:现在必须使用 libadwaita。从 1.1.0 发行说明起我们就警告过即将成真,动机在前链接中已有充分说明。在做出反应之前请仔细阅读!我们向社区征求了反馈,并深入讨论了这一决定。我们交付了回应这些顾虑的特性,如 SSD 支持、一等 CSS 样式等。
  • GTK:最低 OpenGL 版本现在是 4.3。这是为提升性能、更容易修复一些渲染 bug 并使 OpenGL 后端更易维护所需。#7620
  • 附带主题已更新到 release-20250915-154825-b4500fc。由于主题在上游管理,这可能包括主题重命名和颜色变更。如果你在 1.1.3 中工作的主题在更新到 1.2 后失效,请检查关联的通知验证主题名。
  • dlig 字体特性现在默认关闭。这可能导致之前工作正常的连字不再工作。该特性一直被正式规定为"discretionary ligature"(可选连字)特性,意味着应当自愿启用。更常见的 calt(上下文连字)特性保持默认开启。可以用 font-features 配置重新启用该特性。#8164

弃用

以下列表中的弃用目前通过兼容层仍然兼容,但如果一直被忽视,未来发行可能被破坏:

  • adw-toolbar-style 改名为 gtk-toolbar-style。
  • gtk-tabs-location=hidden 被 window-show-tab-bar=never 替代。
  • selection-invert-fg-bg 被 selection-foreground=cell-background 和 selection-background=cell-foreground 替代。#5219
  • cursor-invert-fg-bg 被 cursor-color=cell-foreground 和 cursor-text=cell-background 替代。#5219

这些弃用没有固定的移除时间表,但我们建议尽早迁移到新配置,避免未来任何可能的干扰。

Note

上述弃用将在没有可见警告的情况下继续工作。我们计划在未来的发行中扩展 GUI,使其对配置的弃用显示警告。

完整变更日志

GitHub 上已关闭问题的完整列表。

在各节中,我们尽量把改进排在 bug 修复之前。

  • -e 的命令不再用 /bin/sh 包装执行,而是直接执行。#7032

  • 为 macOS 与 GTK 新增命令面板特性,允许执行大多数 keybind 动作即使它们未绑定。#7153 #7156

  • 方向性的 goto_split 在 macOS 与 GTK 上从当前分屏的左上角出发,向该方向导航到最近的分屏。我们称之为"空间导航",它带来更直观的分屏导航。#574

  • 当多个分屏朝向相同方向时,equalize_splits keybind 动作现在产生更符合预期的较好效果。#7710

  • 新的可选 shell 集成特性 ssh-terminfo 与 ssh-env 改善了在 SSH 上使用 Ghostty 的体验。#7608

  • 光标信息现在可用于 custom shaders,使 custom shaders 能做如光标移动的炫酷动画。#7648

  • 新的 CLI 命令 +edit-config 会在你配置的终端 $EDITOR 中打开 Ghostty 配置。#7668

  • 新的 keybind prompt_surface_title 可用来手动更改终端标题。#2509 #5769

  • 新的 keybind scroll_to_selection 把视口滚动到当前选区的左上角(如果有选区)。#7265

  • 新的 keybind set_font_size 用来设置字体大小。#7795

  • 新的 keybind copy_title_to_clipboard 把当前终端标题复制到剪贴板。#7829

  • 新的 keybind close_tabs:other 关闭除当前分页以外的所有分页。#8363

  • keybinds write_screen_file、write_scrollback_file 与 write_selection_file 现在支持 copy 作为值,把文件路径复制到剪贴板。#7721

  • config app-notifications 新增值 config-reload(默认开启),用于控制重新加载配置时是否显示通知。#8366

  • config:command 值可用 shell: 或 direct: 作前缀,通过 shell(默认)或直接通过 exec 执行命令。#7032

  • config:用 right-click-action = copy 右键复制。#4404

  • config:background-image 可用于为终端设置背景图像。这目前应用于每个终端,而不是窗口。#3645

  • config:env 可用于指定要在终端环境中设置的环境变量。#5257

  • config:quick-terminal-size 可用于自定义 quick terminal 的大小。#2384

  • config:font-shaping-break 配置连字应在何时被打破(分裂)。#4515

  • config:新值 cell-foreground 与 cell-background 可与 selection-foreground、selection-background、cursor-color 一起使用,把它们的颜色值设为动态单元格色。#5219

  • config:新选项 bold-color 用于为粗体指定自定义颜色,使其更易读。#7168

  • config:新选项 selection-clear-on-typing 用于在打字时清除选区。#7394

  • config:新选项 link-previews 决定窗口底部的 URL 预览何时出现。#7831

  • config:新选项 background-opacity-cells 把 background-opacity 配置应用到显式单元格背景(例如来自正在运行的程序)。#7913

  • config:新选项 faint-opacity 配置被终端程序标记为 faint 的单元格所用的不透明度。#8472

  • config:新选项 right-click-action 可配置点击鼠标右键时的行为。#8254

  • cli:在 +list-themes 中按 enter 现在会显示关于如何配置主题的帮助文本。#4731

  • cli:+list-themes 现在有旗标可以过滤浅色与深色主题。#7235

  • cli:向 +list-themes 添加主题过滤。#8082

  • cli:+list-colors 在十六进制码之外还显示颜色。#8393

  • custom shaders 现在可以在运行时重新加载。#7620

  • custom shaders 与背景色正确混合。#7620

  • 在点击时把按下或松开鼠标悬停在窗口上方或下方,现在会滚动视口,而无需抖动鼠标。#4422

  • shell-integration:现在用单个 GHOSTTY_SHELL_INTEGRATION_FEATURES 环境变量来指定启用的特性,而不是多个环境变量。#6871

  • shell-integration/elvish:OSC 7 报告改用 kitty-shell-cwd:// 方案,因此我们不必编码它。#7033

  • 分屏与标签页导航的 keybinds,如 goto_split 与 next_tab,支持 performable。#7680

  • font:改进用于缓存的字形哈希性能,在合成压力测试中提速约 5%。#7677

  • 修复特定 font-family 旗标传给 CLI 时可能发生的崩溃。#7481

  • 配置 adjust-cursor-thickness 现在与 cursor-style=underline 一起工作。#7732

  • 解决在输入 preedit 文本(例如使用输入法时)时按 backspace 的问题。#5728

  • config:keybind=(空值)恢复默认键位绑定,行为类似其他 <key>= 空值。#5936

  • config:palette 配置现在支持调色板编号与颜色之间的空白。#5921

  • config:所有接受颜色列表的配置(如 macos-icon-ghost-color)支持逗号后有空格。#5918

  • copy_url_to_clipboard keybind 动作与 OSC 8 超链接配合正确。#7499

  • font:回退字体大小被自动调整,使视觉上更接近主字体大小。#7840

  • font:支持新 sprite:U+1CC00 到 U+1CCFF、U+1CE00 到 U+1CEFF、U+2500 到 U+25FF、U+1CE00 到 U+1CEFF、U+1FB00 到 U+1FBFF。#7755 #7761

  • font:U+25E4 与 U+25E2(几何形状)现在用内建 sprite 字体栅格化。#3344

  • font:几何形状的角部现在用内建 sprite 字体栅格化。#7562

  • font:字形约束逻辑大幅改进,使 Nerd Font 图标等显示更正确。#7809

  • input:对支持的键盘,copy 与 paste 物理键现在分别默认绑定到 copy_to_clipboard 与 paste_from_clipboard。#8586

  • input:默认的 copy_to_clipboard 绑定被标记为 performable,意味着如果没有可复制的文本,按键会被编码到 pty。这允许 TUI 捕获它。#8504

  • input:鼠标滚轮到鼠标事件的映射被修改为更好地匹配其他终端模拟器。#6052

  • input:ctrl+<ASCII> 在更广泛的键盘布局上有效。#7309

  • input:点击时拖动鼠标会取消任何鼠标链接动作。#7080

  • input:goto_tab 绑定现在默认绑定到物理与逻辑数字键两者,以适配更多键盘布局。#8486

  • renderer:改善缓存字形查找性能的微优化。#8536

  • 优雅处理启动终端命令时 exec 系统调用失败的情况。#7793

  • "无法启动进程" 的错误消息现在不能通过按下修饰键解除。#7794

  • 修矩形选择左上角或右下角在视口外时的渲染问题。#7692

  • 修复 octant 渲染的一些舍入错误,它们曾导致在某些场景中 octant 不能对齐。#7479

  • 修复一些鼠标选区逻辑,它们有时导致 Ghostty 错误地多选一行或一个字符。#7444

  • 修复文件路径正则表达式,要求至少有一个斜杠。#7355

  • 修复在特定位置回字形带有间隔片时可能发生的崩溃。#7537

  • 使用 Kitty 图像协议渲染的图像现在使用正确的 gamma 混合。#7368

  • 修复视口指针越界时缩小可能崩溃的场景。#7899

  • 修复内存页面的超链接空间被耗尽时可能发生的崩溃。#8009

  • 修复首帧渲染的未定义内存访问。#7982

  • 修复按住修饰键搜索链接时发生的内存泄漏。#7998

  • 修复位图分配器正好分配了 64 个块时的崩溃。#8276

  • 修复字体图集错误路径中可能的 use-after-free。没有已知野外会触发的案例。#8249

  • 修复一些内部 OOM 情况下可能的崩溃,这些情况下后备缓冲区的扩展未被正确实现。#8277

  • 修复 OSC 解析器中可能导致崩溃的未定义内存访问。#8307

  • 修复 Kitty 图像 z-index 的问题。#7671

  • shell-integration/bash:不再依赖有效的 GHOSTTY_RESOURCES_DIR 环境变量。#7611

  • shell-integration/bash:修复可能打印出垃圾字符的场景。#7802

  • shell-integration/bash:更可靠地保留已有环境。#7908

  • 不在 OSC 7 路径报告中解析符号链接。#7773

  • 附带主题更新到 release-20250915-154825-b4500fc。这可能重命名已有主题。如果你的主题失效,请检查主题是否被重命名。重命名在上游完成,我们无法规避。

  • inspector:修复小数像素尺寸的显示。#8179

  • contrib/vim:修复 scratch 缓冲区中配置的语法高亮。#7119

终端能力

本节涵盖终端模拟的变化与暴露给在终端内运行的应用的其他能力。

Ghostty 依旧聚焦于终端模拟器兼容性,因此 Ghostty 1.2 中的变更只是增加或改进与其他终端模拟器特性的兼容性。在 Ghostty 的未来版本中,我们计划添加新的 Ghostty 专属特性,供应用开发者利用。

  • vt:添加对 mode 47 的支持。#7443
  • vt:添加对 mode 1048 的支持。#7473
  • vt:解析更多 ConEmu OSC 9 序列。Ghostty 反应的 ConEmu OSC 9 序列只有 9;4 进度条序列。其余被解析但忽略。#8410
  • vt:色彩操作与 xterm 的特性支持与兼容性显著改进。其中包括 OSC 4、5、10-19、104、105、110-119。除了支持新的序列,对已支持的颜色操作的兼容性做了修正。#8590
  • vt:在 primary DA 报告中显示 OSC 52 的支持。#7725
  • vt:OSC 4/104 允许多个颜色规范。#7402
  • vt:允许 SGR 序列最多包含 24 个参数,修复了一些 Kakoune 主题。#8417
  • vt:OSC 52 可以通过发送空字符串清空当前剪贴板。#8018
  • vt:XTGETTCAP 对小写十六进制字符正常工作。#7229
  • vt:Kitty 图像协议支持按范围删除。#5957
  • vt:修复某些使用 Kitty 图像协议的图像的高宽比问题。#6673
  • vt:Kitty 图像协议接受无控制数据的命令。#7023
  • vt:不强制 Kitty 图像对齐网格。#7367
  • vt:修复 mode 47、1047、1049 交替屏幕的边缘情况,以更好地匹配 xterm。我不知道有真实程序触发这些 bug,但这是好的卫生习惯。#7471
  • vt:在普通屏与 alternate screen 之间切换时清除超链接状态。#7471
  • vt:ctrl+esc 现在生成恰当的 Kitty 键盘编码。#7000
  • vt:index(\n)操作在特定边缘情况下清除正确的行。这修复了某些场景中 vim 状态条的错乱。#7093
  • vt:点击一个未聚焦的窗口不再编码为鼠标事件。#2595
  • vt:修复某些不完整转义序列的未定义内存访问。#8007
  • vt:OSC 9 通知可以包含单字符消息。#8396
  • vt:当 VS15 使默认宽字符变窄时,光标向回移动一格。#8538

macOS

  • macOS:支持 macOS 26 (Tahoe)。
  • macOS:你现在可以撤销与重做关闭任何类型的终端(窗口、标签页或分屏)。我们把最近关闭的终端保留在内存中一段可配置的时长(默认 10 秒),这样不小心关掉也能恢复。#7535
  • macOS:只读的 Accessibility API 集成允许屏幕阅读器读取 Ghostty 的结构与内容。AI 软件读取 Ghostty 的内容也受益于这一点。这需要辅助功能权限,所以它是自选的。#7601
  • macOS:与 App Intents 的集成使 Ghostty 可以用 Apple Shortcuts 自动化。#7634
  • macOS:响铃实现。默认情况下,铃声会让 Dock 图标弹跳并在标题中放置铃铛 emoji。终端被聚焦或有任何输入时会被清除。铃声不发出任何声音。这些都可以用 bell-features禁用。#7099
  • macOS:从 Finder 执行或拖入 Dock 的脚本现在通过登录 shell 执行并向 stdin 发送 <filepath>; exit。这与内置 Terminal 及其他终端加载你的登录脚本的方式一致。#7647
  • macOS:自定义图标现在在 Ghostty 未运行时被持久化。#8230
  • macOS:为 OSC 9;4 进度条序列显示原生 GUI 进度条。#8477
  • macOS:新增 bring_all_to_front keybind 动作,把所有 Ghostty 窗口带到前台。#4704
  • macOS:新增 reset_window_size keybind 动作,把窗口大小重置为初始尺寸。#6038
  • macOS:新增 check_for_update keybind 动作。#7235
  • macOS:添加"恢复到默认尺寸"菜单项。#1328
  • macOS:macos-hidden 配置会把 Ghostty 从 Dock 与标签页菜单隐藏。#4538
  • macOS:点击链接现在使用 NSWorkspace API 而非 open 命令。这保留了源应用(Ghostty),使其他程序可以用它来按需调整行为。#5256
  • macOS:新配置 macos-window-buttons 用于隐藏红绿灯按钮。#7504
  • macOS:现有 macos-non-native-fullscreen 配置的新选项 padded-notch,把非原生全屏窗口放到刘海下方,同时仍隐藏菜单栏。
  • macOS:新的 keybind 动作与菜单项 toggle_window_float_on_top 让特定窗口在非聚焦时也始终悬浮。#7237
  • macOS:均分分屏现在在 quick terminal 中有效。#7480
  • macOS:quick-terminal-position=center 现在支持调整大小时保持中心位置。#8398
  • macOS:从 Finder 执行或拖到 Dock 的脚本总是要求手动确认才执行。#8442
  • macOS:分屏的 zoom 按钮现在在标题栏分页和单分页时也可见。#7502
  • macOS:window-save-state 现在保存终端标题。#7938
  • macOS:Cmd+h(macOS 隐藏窗口)在尝试隐藏最后一个可见窗口时不再发送 h。#5929
  • macOS:maximize 配置现在在 macOS上 工作。#5928
  • macOS:按键输入处理速度提高约 10 倍。#7121
  • macOS:点击红色交通灯时区分关闭标签页与关闭窗口。#7618
  • macOS:设置 macos-titlebar-style=tabs 时标题文本垂直居中。#5777
  • macOS:通过 CLI 启动的 Ghostty 现在会到前台。#8546
  • macOS:切换非原生全屏幕时,焦点不再跳转到第一个分屏。#6999
  • macOS:cmd+. 现在可以绑定。#6909
  • macOS:被约束到终端单元格的字体字形现在显示得更锐利。#6914
  • macOS:close_window keybind 动作现在可用。#7003
  • macOS:quick terminal 在全屏幕 space 上可以更可靠地出现与消失。#7070
  • macOS:从视窗左边界以外的选中不再向上滚动一行。#7071
  • macOS:用 macos-titlebar-style=hidden 新建的窗口现在像其他窗口一样级联位置。#7567
  • macOS:不带文字却清掉 preedit 的按键输入不应编码到 pty。#7226
  • macOS:键盘快捷键现在 与 macOS 的"Dvorak - QWERTY ⌘"布局正确契合。#7315
  • macOS:对小数鼠标滚动事件向上取整,使带滚轮鼠标感觉更实用。#7185
  • macOS:菜单栏中现在提供了所有分屏方向与上下文菜单。#5807
  • macOS:用 OSC 7 设置 pwd 现在与 macOS 的"Private Wi-Fi Address"特性协同。#7029
  • macOS:重新调整大小浮层现在使用与语言无关的 w x h格式并省略单位。#7142
  • macOS:"Services -> New Ghostty Window/Tab Here"现在支持文件。#7286
  • macOS:使用非原生全屏幕时可靠地保留焦点。#7279
  • macOS:听写现在实时流式传输待定文本。#8490
  • macOS:听写图标正确显示语言选择器。#8490
  • macOS:听写图标随文字流正确移动。#8490
  • macOS:修持久保留最近关闭的表面内存的内存泄漏(每次只有一个)。#7507
  • macOS:修复未能释放 CoreText 字体特性导致的内存泄漏。#7770
  • macOS:修复回退发现 font descriptors 的内存泄漏。#7770
  • macOS:修复 ObjC 块的内存泄漏。#7770
  • macOS:修复同时设置非原生全屏与 fullscreen = true 时可能发生的崩溃。#7277
  • macOS:如果设置 title,标题会在加载时立刻设置到窗口上,让窗口管理器更早看到标题。#6056
  • macOS:cmd 按键 不会被传统键编码(legacy key encoding)。#6057
  • macOS:在 quick terminal 中任何方式调用 new_tab 都会显示友好的错误,而不是新建窗口。quick terminal 中的标签页将在未来版本中支持。#5939
  • macOS:关闭非原生全屏窗口时会正确恢复菜单栏。#7525
  • macOS:窗口获得焦点时自动清除任何通知。#7531
  • macOS:窗口关闭时自动清除任何通知。#7531
  • macOS:已聚焦窗口的通知几秒后会自动清除。#7531
  • font/coretext:改进字体搜索排序使其更一致。#7483
  • man pages 现在提及 macOS 特有的配置路径。#5938

GTK(Linux、FreeBSD)

  • GTK:支持 FreeBSD。这项工作全部由一位社区成员推动,我们非常感谢他们的贡献。#7606
  • GTK:风格上能匹配更广泛桌面环境的新图标。由于 Linux/BSD 生态的多样性,这永远不会完美,但新图标是很大的进步,使应用不那么 macOS 中心。#8038
  • GTK:通过向 Ghostty 发送 SIGUSR2 可以重新加载配置。#7759
  • GTK:新的 gtk-titlebar-style=tabs 把标签页放到窗口的标题栏中。#8166
  • GTK:quick terminal 现在可以在 Linux 上以 Wayland 与 wlr-layer-shell 协议工作。#4624
  • GTK:global: keybinds 现在只要 XDG desktop portal 可用(几乎所有桌面环境)就能工作。#6051
  • GTK:为 OSC 9;4 进度条序列(如 systemd 发出的那些)显示原生 GUI 进度条。#7975
  • GTK:音频铃声支持(默认关闭)可以用 bell-features=audio 并设置 bell-audio-path 与 bell-audio-volume 来启用。#5326
  • GTK:安装 DBus 与 systemd 激活服务以加快启动。#7433
  • GTK:OpenGL 渲染器现在支持线性混合,颜色混合更正确。#7620
  • GTK:注册 X-KDE-Shortcut 键,使 KDE 上可以注册快捷键打开 Ghostty。#7673
  • GTK:在 Linux 上对 async API 在 io_uring 与 epoll 之间动态选择。此前硬编码为 io_uring,只有 epoll 的系统必须从源码构建。#5916
  • GTK:新配置 async-backend 可设为 epoll,在 Linux 上强制使用 epoll 而不是 io_uring。这在 iowait 报告有问题的内核上很有用。#5916
  • GTK:新配置 window-show-tab-bar 自定义标签栏何时可见。#5590
  • GTK:新配置 quick-terminal-keyboard-interactivity 专门为 Wayland 自定义键盘交互设置。#7477
  • GTK:新 keybind 动作 show_gtk_inspector 显示 GTK inspector,因为终端 keybinds 通常会盖掉 GTK 的默认绑定。#7468
  • GTK:新分页按钮现在有了可以新建分屏的下拉菜单。#7127
  • GTK:剪贴板确认对话框中加入"记住选择"开关。#6783
  • GTK:当命令异常退出或设置 wait-after-command 时,显示新的原生 GUI 元素。#7836
  • GTK:支持屏幕键盘。#7987
  • GTK:如果 title 被设置,窗口在初始化时立即具有标题,而不是在表面初始化之后。这让窗口管理器能够读取并使用它。#8535
  • GTK:OpenGL 渲染器初始化失败时显示原生 GUI 元素,而不是空白窗口。#8390
  • GTK:把文件路径拖到终端时转义 ( 与 )。#6922
  • GTK:copy-on-select=clipboard 在选择时不再造成 toast 刷屏。只有当鼠标释放时才复制。#4800
  • GTK:所有分屏方向现在都可从菜单栏和上下文菜单中使用。#5779
  • GTK:对 wait-after-command 不请求关闭确认。#7500
  • GTK:使用 server-side decorations 时,移除导致窗口有可见边框的 solid-csd CSS 类。#8127
  • GTK:修复最后一个分页关闭后窗口有时变空且不关闭的问题。#5837
  • GTK:resize 浮层现在使用与语言无关的 w x h 格式并省略单位。#6013
  • GTK:关闭时正确清理表面 cgroup。#6766
  • GTK:降低 OpenGL 调整大小时的闪烁/拉伸。#7155
  • GTK:在更多安装环境中检测 GHOSTTY_RESOURCES_DIR。#6814
  • GTK:修复 xdg-open 调用会留下 defunct 进程的情况。#7657
  • GTK/X11:修复使用 > 200% 缩放时的模糊区域。#6978
  • font/freetype: 现在支持真正的位图字体。#8512
  • font/freetype: 修复使用没有 SFNT 表的字体时可能发生的崩溃。#8483
  • font/freetype: 载入 SVG 字形时报错,因为无论如何都不支持它们。#6824
  • font/freetype: 修复罕见场景中数据竞态可能引起的崩溃。#7238
  • font/freetype: 将更多非 UTF-8 编码的字体名转换为 UTF-8。#8204
  • packaging: 实验性 snap 打包现在在 CI 中被测试。发布的 snap 镜像目前由外部维护者维护。#3931

面向软件包维护者的变更

  • 我们现在生成带一些预处理文件的源码 tarball,这是许多源码 tarball 的常见做法(例如把 parser .y 转换为 .c)。对 Ghostty,我们把 Blueprint ui 转换为 xml 文件,还有翻译与 GTK 资源文件。这使 Ghostty 可以在旧平台上、没有较新构建工具的情况下构建。打包者应当使用源码 tarball,而不是 Git 检出。PACKAGING.md 文档已更新加入该信息。 #6800

  • GLFW apprt 已被删除。它从来不是受支持的 apprt,只用于开发与测试。我们在 PACKAGING.md 文档中警告过不要打包 GLFW。现在它被删除,因为我们不再需要它做开发或测试。#7815

  • "tip" 发行不会以相同的 commit 覆盖之前已发布的 tip。这保证了 checksum 在发行被剪出后保持稳定。对提供 tip 软件包的打包者,这应改善安全性与工具链兼容性。tip 发行一直都有签名。#8549

Flatpak/Snap 更新

Ghostty 1.2 现在自带构建 Flatpak 与 Snap 的配置。我们为每次提交在 CI 中测试,并努力保持 Ghostty 可通过这些分发方式工作。不过,我们还未官方提供或维护 Flatpak 或 Snap 软件包。

这是重大进展:Ghostty 1.1.x 不打补丁时完全无法作为 Flatpak 或 Snap 软件包工作,官方项目也从未承诺维护这些包。现在,我们至少在这些平台上构建并测试,虽然仍未达到官方分发。

官方分发的两大阻力是维护者的兴趣与发行自动化。Ghostty 目前的维护者没有任何人是 Snap 或 Flatpak 构建的主力维护者,我们对长期维护这些包的能力没有信心。如果你有兴趣帮助维护 Ghostty 的 Flatpak 或 Snap 软件包,请加入 Discord 并在 #packaging 给我们发消息。

路线图

Ghostty 1.3 将继续聚焦于通过交付其他流行终端模拟器对等所需的最后几个主要缺失特性,使 Ghostty 成为 "best existing terminal emulator"。也就是说,我们计划至少为 1.3 交付回滚搜索与滚动条。2

Ghostty 1.3 的主要焦点将是桌面应用特性(回滚搜索与滚动条属于其中)。Ghostty 的核心终端模拟特性已经证明非常丰富与稳定。不过,我们计划继续扩充 VT 特性支持,例如采用其他人在近期发布到生态中的新实验协议。

回应常见的请求:Windows 与 作为独立库的 libghostty 没有列入 Ghostty 1.3 的计划。它们仍是长期路线图的一部分,但我们想先聚焦现有平台与桌面应用。

迁移到三月/九月的发行周期

Ghostty 将转向 major/minor 发行每 6 个月一次的节奏,下一个 minor 发行(1.3.0)计划在 2026 年 3 月。三月/九月的发行周期能很好地与许多主流 Linux 发行版及 macOS 对齐。补丁发行(如 1.2.1)将按需要无定期地发布。

这对现代应用是相对较长的发行周期,但它让开发团队聚焦于大型、有影响的功能,并有足够时间在 tip 发行中稳定。对打包者,这避免了频繁打包新发行的折腾。与主流 OS 发行对齐也让我们能确保重大发行在新 OS 版本上良好工作。

对想要更频繁更新的用户,我们推荐在 macOS 上使用 tip release 通道,或在 Linux 上频繁地从源码构建。我们有数千名 nightly 用户(感谢测试!),整个维护团队都在努力保持 tip 发行稳定。在整个 1.1 到 1.2 的开发周期中,我想不起来 tip 发行因日常使用而损坏的任何一次。

Footnotes

  1. 我没有做全面调查,但我找不到任何其他支持 OSC 9 通知、OSC 777 通知 并且 OSC 9;4 进度条的终端模拟器。 ↩

  2. 这里的"对等"是以宽松的含义使用的,指其他终端模拟器最流行、最常被使用的特性的一种对等。有一些长尾特性我们可能永远不会完全实现(我们的特性对它们来说亦然) ↩