关于 Ghostty

Ghostty 是一款以快速、功能丰富、原生为特色的终端模拟器。市面上虽有许多优秀的终端模拟器,但它们都迫使你在速度、功能或原生 UI 之间做出取舍。Ghostty 三者兼备。

在各个方面,我并不是要宣称 Ghostty 是最好的(比如最快、功能最丰富或最原生)。但当我着手开发 Ghostty 时,我深感所有终端最多只让你在三个维度中选两个。我想要打造一款在这三个维度上都具有竞争力的终端,而我相信 Ghostty 实现了这个目标。

在深入细节之前,我还想说明,Ghostty 是由 Mitchell Hashimoto(也就是我!)发起的热情项目。这是我利用业余时间投入心血的劳动成果。在与项目互动时,请不要忘记这一点。我会和可爱的贡献者们一起尽力把它做得更好,但这对于我们任何人都不是一份全职工作。

原生

“原生”的大意是:Ghostty 的设计目标,是让它在你的桌面环境中拥有你所期望的外观、手感与行为。

重要的是,Ghostty 在 macOS 与 Linux 上确实是原生应用。在 macOS 上,GUI 使用 Swift 编写,并采用 AppKit 与 SwiftUI。在 Linux 上,GUI 使用 Zig 编写,并采用 GTK4 C API1。这些 GUI 与一个由 Zig 编写的共享核心对接,我们称之为 “libghostty”。对于不熟悉 Zig 的人,它是一种编译为原生机器码的系统编程语言。

其中一部分是使用原生 UI 组件2来实现诸如标签页、分屏、错误提示等功能,这与许多其他终端模拟器形成对比——它们要么使用文本 UI 与自定义控件,要么根本不支持这些功能。

另一部分是使用你已经熟悉的标准键盘与鼠标快捷键。Ghostty 在 macOS 与 Linux 上使用不同的默认绑定,以匹配各平台的惯例。

还有一部分是 Ghostty 与运行平台独有的系统能力进行集成。例如在 macOS 上,Ghostty 支持快速预览(Quick Look)、力度触控、macOS 安全输入 API、重启后内建窗口状态恢复等。这些都是 macOS 提供的原生 API,在 Linux 桌面环境中并没有对应物。

功能丰富

Ghostty 力求提供一套对日常使用很有帮助的丰富功能。这些功能可分为两类:终端功能与应用功能。

终端功能包括运行在终端内部的程序所能使用的能力。例如,Ghostty 支持 Kitty 图形协议、浅色/深色模式通知、超链接等等。这让 Neovim、Zellij 等终端应用能够做到在其他终端模拟器中无法完成的事情3。

应用功能则是更高层的、用于与终端模拟器本身交互的功能。例如,Ghostty 支持原生标签页、分屏、macOS 上的下拉式终端、随系统深浅色模式切换主题等。

快速

Ghostty 追求快速。

性能是一个容易让人争论不休的话题,所以我唯一的主张是:Ghostty 的目标是与最快的终端模拟器处于同一档次。在某些基准测试中它更快,在另一些中它更慢,但无论如何都不应该有人说 Ghostty 慢。

“快”也是个含义丰富的词,因为“快”对不同的人可能意味着不同的事。例如,下面只是“快”可能涵盖的一部分内容:启动时间、滚动速度、IO 吞吐量、控制序列吞吐量、帧率等等。

未来,我希望提供详细的基准测试,并解释 Ghostty 在各种性能维度上的表现。对于首次公开发布,我只能说 Ghostty 的目标是如上所述的“快”。

我知道很多人不相信速度对终端模拟器那么重要,但 Ghostty 的新用户反复告诉我,速度提升对他们日常使用的影响有多么明显。希望你也这么觉得。

libghostty

Ghostty 还以其架构而与众不同。Ghostty 的核心是一个跨平台、兼容 C ABI 的库,名为 libghostty。libghostty 提供核心的终端仿真、字体处理与渲染能力。

Ghostty 的 GUI 应用是 libghostty 的使用者。macOS 应用使用 Swift 编写,采用 AppKit 与 SwiftUI,并链接到 libghostty 的 C API。Linux 应用使用 Zig 编写,采用 GTK4 C API,同样链接到 libghostty4。

这种架构实现了终端仿真与 GUI 之间的清晰分离。正是这一关键架构,让 Ghostty 得以实现其原生的目标。

这一架构也让 Ghostty 显得独一无二,因为 Ghostty 项目同样致力于让其他终端模拟器项目能够构建在共享核心之上。这将催生一个更加多元的终端模拟器生态,让它们可以专注于更高层的功能与 UI,而无需重新实现核心的终端仿真。

Note

在首次公开发布时,libghostty 还不是稳定的 API,也尚未作为独立的稳定库发布。不过,它已经被 macOS 与 Linux 的 GUI 应用所使用。目标是稳定该 API,并在未来将其作为独立库发布。

Footnotes

  1. Linux 并不像 macOS 那样有“原生”的 GUI 工具包,但 GTK4 是最接近标准 GUI 工具包的存在。最重要的是,我们不绘制自定义控件,Ghostty 能很好地融入你的桌面环境。 ↩

  2. Linux 使用 GTK4 以及(可选的)Adwaita,因此 Ghostty 会看起来、用起来像一个 GTK4 应用,它是否“原生”取决于你的桌面环境以及你对“原生”的定义。另见注 1。 ↩

  3. 例如,Neovim 使用同步渲染来防止帧间撕裂。 ↩

  4. 由于 GTK4 应用使用 Zig 编写,它并不是传统意义上的“链接”。相反,它使用公开的 libghostty API,并作为单一的 Zig 编译单元进行编译。 ↩