将终端界面打包成原生桌面应用通常是一场噩梦。但是,Ghostty 终端背后的团队刚刚发布了 Ghostling,这着实让我感到惊艳。它基本上是将 Ghostty 极速的核心引擎抽离了出来,让你能够将一个真正的命令行嵌入到任何应用程序中。整个演示项目仅仅是一个使用 Raylib 处理图形渲染的 C 语言文件。开发者们已经开始利用它来完全绕开 Electron 了。这简直太不可思议了。

大家好,欢迎来到今天的分享,今天我们探讨的主题是"从极简,至无限"。大家现在看到的,是基于 libghostty C API 的最简可行终端模拟器,这正好印证了屏幕上这句拉丁文的意思,从最微小的事物中,可以诞生出无限的可能。

首先我要澄清一点,那就是所谓的"终端的极简证明"。Ghostling 并非大家日常使用的完整终端,它本质上只是一个单文件概念验证,目的只有一个,那就是向各位展示 libghostty 的极致灵活性。在这个演示中,它是基于单文件 C 语言编写的,使用了 Raylib 来进行渲染,并且为大家完整展示了单线程架构的运行方式。

让我们剥离表面的复杂性,来看看底层的架构堆栈。整个架构非常清晰,最上方的应用层或者说渲染窗体,就是 Ghostling 作为一个 Raylib 2D 渲染引擎,负责最终的视觉呈现。中间则是整个系统的核心大脑:libghosty-vt。它承担了 VT 序列解析、终端状态管理以及光标与文本重排等关键任务。而最底层的依赖极为纯粹,做到了真正的零依赖,甚至完全不需要 libc。

别看它外表极简,这其实是一台真正的工业级引擎。它内置了 SIMD 优化解析,能为你带来闪电般的输入处理速度。同时它具备领先的 Unicode 支持,可以完美搞定完整的多码位字形处理。为了保证可靠性,它经历了深度模糊测试以及极其严格的正确性测试。更重要的是它是久经考验的,这套核心逻辑每天都在支撑着 Ghostty GUI 背后海量的活跃用户。

在实际开发中,我们需要明确 API 的边界矩阵,搞清楚在这个模拟与体验的过程中,哪些是核心供给,哪些需要你自行构建。libghostty 已经为你准备好了完整的 24 位色彩与文本样式、窗口调整与文本重排、鼠标追踪与滚动协议,甚至是 Kitty 键盘与图形协议。不过要提醒一下,Ghostling 示例中的 Kitty 协议目前受限于 Raylib 输入系统的底层限制。至于右侧的功能,比如多标签页与分割窗口、会话管理、配置文件解析以及搜索界面交互,这些外围体验都需要各位开发者自行去构建。

这个库只负责追踪状态,到底怎么渲染完全由你来决定。有人问 libghostty 是不是必须依赖 Raylib?答案是绝对不是。中间的 libghostty 仅做状态追踪,你可以接上 Ghostty GUI 的原生选择比如 OpenGL 或 Metal,你可以像示例中一样使用自定义的 2D 引擎,你甚至可以把它编译成 WASM 从而完美兼容浏览器环境。

那为什么偏偏选择了 C 语言呢?因为它是最通用的底层适配器。希望采用最广泛使用的语言接口,以极薄的绑定去赋能所有的技术生态。通过 libghostty-vt 的 C API 或 Zig API,你不仅能使用 Zig 的原生能力,还能获得 Rust 的零依赖绑定,甚至能让 Go、Python、Node 等社区无缝接入进来。

在大家动手之前,有几个构建协议与硬性约束需要注意。你的环境里需要准备好 CMake 3.19 及以上版本、配置好环境变量的 Zig 0.15.x,以及标准的 C 编译器。这里有一个非常严肃的警告:严禁在 Debug 模式下进行性能基准测试。原因很简单,Ghostty 在其中包含了大量用于安全和正确性的额外校验,所以 Debug 模式下的运行速度会极慢,这无法代表真实的性能。