Ghostty 里的哲学

lxiol

原文链接:https://mp.weixin.qq.com/s/1GDcVyhadmSa9b1hNZsfxg

Ghostty 是一个快速、特性够用、跨平台终端模拟器,拥有平台原生 UI 体验。但 Ghostty 里的哲学让我受益最多。

关于 Ghostty

Ghostty 是一个快速,特性够用,跨平台原生 UI 体验的模拟终端,由 Mitchell Hashimoto1 创建并维护。我已带着 dscli 翻译学习了他几篇文章,比如

-

    1. Ghostty Largest Memory Leak2
    1. Ghostty Is Leaving Github3
    1. Growth of AI Through a Cloud Lens4
    1. My AI Adoption Journey5

等,受益良多,其中 Ghostty 里的蕴含的哲学让受益更多。

关于 Mitchell Hashicorp

从 Mitchell 的文章里,尤其 Ghostty Largest Memory Leak 2 和 Ghostty IsLeaving Github 3 两篇,感觉 Mitchell 不擅言辞,一旦打开 话匣,又知无不言,言无不尽,而且饱含情感。我以及身边朋友,多是这样。我 们这些人说好听的,是诚实木讷。要以聪明灵巧人视角,就是程序员老登么。老 登写一辈子代码,到老没混出人样,还在写代码。写就写吧,还想年轻人听自己 言语,这就不好了么。

所以我不太想说自己话。又不想说他们话。不说“良心上过不去”这些没人信的, 独自保守“狼来了”的秘密,看着“傻白甜们”被狼斯文吃掉,内心也痛苦不堪。 于是翻译。翻译其他老登的话,有

-

    1. Mitchell Hashicorp 1
    1. antirez 6
    1. Andrew Tridgell 7

老宅登

我其实知道年轻人叫我们老程序员为“老登”,或者“上古神登”这个梗,是因 为我们和美前总统拜登一样老,又和拉登一样的宅。

img

两点都确实,尤其大多老程序员都很宅。

关于 Andrew Tridgell

Andrew 宅在澳大利亚,从照片看不算老,但这是 20 年前拍摄。关于老,Andrew 自己认。参见 Andrew Tridgell 的 Rsync and Outrage8 。公众号前翻翻 也有。如 Andrew 所言,他不怎么说话了,就是有话也讲在 Ardupilot 的博 客9 。说也说的是“老登”们老话,不听老登言,吃亏在眼前;年轻人的 傻话、白话、甜话咱也不爱听。

img

Andrew Tridgell 是 Rsync 的创建者, Rsync 的核心算法正是他博士论文的一 部分。除此,他还发明 Samba。严格讲 Samba 不算发明,Samba - Opening Windows to a Wider World。Tridgell Hack 了 Windows SMB(Service Message Block)协议。有了 Samba,Linux 服务器才能和 Windows 电脑互相访问共享文 件。这是大约 35 年前(1991~1992)的事。

1
`S   M   B``|   |   |``+-a-+   |``|   +-a-+``|   |   +--+``v   v   v  v``S   a   m  b  a````Andrew Tridgell:``"抓包分析 -> 逆向协议 -> 加两个 a"`

2005年,Tridgell 当时需要读 BitKeeper 仓库。没只读接口?抓包,分析协议, 写了个 bkbits。BitMover 翻脸不干了。Linus 写了 Git。就这些。

1
`bk+bits=bkbits``bits\```-> git``Andrew Tridgell(2005)`

今天看到流浪代码收容所项目 JunkCode10 (起始于1993年),觉得很有 意思,有时间我会带着智能体 dscli11 去嘎悠嘎悠。

1
`Andrew Tridgell``|-- Samba (1992)     逆向 SMB``|-- junkcode (1993)  流浪代码收容所``|-- rsync (1999)     差异算法,博士论文核心``|    `-- AI (2026)   用 AI 重写 rsync,引发争议```-- bkbits (2005)    几个 bits 激怒 BitKeeper```-- Git (2005) 勾出Linus, 创建Git`

扯远了,回到 Ghostty 12 ,这个特性充沛的终端。

终端特性可以分为两类

-

    1. 面向终端用户
    1. 面向终端应用开发者

关于 Ghostty 的使用

包括

-

    1. 多窗口 - multi-window
    1. 多标签 - tabs
    1. 切分 - splits
    1. 连字 - ligatures
    1. 自动更新 - auto-update 等

这些特性用户用起来丝滑,同时无需终端中应用做任何改变。举几个例子

-

    1. 连字 ligatures
      输入 >= 终端显示 ≥
    1. 屏幕切分 - splits
1
`ghostty +list-keybinds | grep split`

Key

Bind

ctrl+shift+o

new_split:right

ctrl+shift+e

new_split:down

super+ctrl+[

goto_split:previous

super+ctrl+]

goto_split:next

ctrl+alt+arrow_up

goto_split:up

ctrl+alt+arrow_down

goto_split:down

ctrl+alt+arrow_left

goto_split:left

ctrl+alt+arrow_right

goto_split:right

super+ctrl+shift+arrow_up

resize_split:up,10

super+ctrl+shift+arrow_down

resize_split:down,10

super+ctrl+shift+arrow_left

resize_split:left,10

super+ctrl+shift+arrow_right

resize_split:right,10

ctrl+shift+enter

toggle_split_zoom
 对用户而言,了解屏幕切分的键绑定,知道如何使用就可以了。由于 Ghostty 的设计目标之一是要提供平台原生的使用体验,屏幕切分的键绑定可能不同, 可以通过 +list-keybinds 查看。

    1. 终端下查看图片

img

    1. 终端下运行 Yazi

img

    1. Ghostty 的配置13
1
`ghostty +help | grep config`

action

description
+edit-config
14

指定编辑器打开并编辑配置
+show-config
显示已更改配置和默认配置( --default )
+validate-config
校验配置是否合法
 三个 Action 形成完美逻辑闭环。另加

    1. 所有通过配置文件( ~/.config/ghostty/config.ghostty ) 可配置的都 可以通过命令行参数传入,如 --font-family="Fira Code" 更改字体, --font-size=12 更改字号。
    1. 配置文件遵循简单 key = value 形式,支持注释
  • 3. ghostty \plus{}list-keybinds | grep config
    key

bind

说明

ctrl+shift+,

reload_config

动态加载配置

ctrl+,

open_config

打开配置并编辑

可以看到用户层面的特性 Ghostty 做的严谨而克制,好的方面不太宣传,内存 泄漏反倒写文章认真分析(见 Ghostty Largest Memory Leak15 一篇)。

Ghostty 用户界面信息是自包含的。你可以从 ghostty +help 出发,找到每个 特性的使用、配置方法。前提是你要理解 UNIX 哲学。从这个层面来讲对用户的 要求就非常高了。因此 Mitchell 文章 You have to feel it 里的 You, 也许 包括你,如果你能懂点 UNIX 哲学,也许就不包括你,如果你一辈子在 Windows 下(或 MacOS 下)咔咔乱点的话。当然,如果你是 Emacs 拥趸,你肯定能看到 UNIX 的灵魂,拉扯起 Linux,滋养大 Emacs,如今又附身于 Ghostty 了。

面向终端应用开发者特性

比如

-

    1. Kitty graphics protocol - Kitty 图形协议
    1. Kitty keyboard protocol - Kitty 键盘协议
    1. Synchronized rendering - 同步渲染
    1. light/dark mode notifications 等

这些特性面向终端应用开发者,例如上界提到的 Yazi , Chafa 和 viu 等的开 发者,他们需要这些特性和协议实现来给用户提供功能。除此外我还想说几句 Ghostty Custom Shaders,最近网上疯传的 Ghostty Blackhole 16 就基 于此。

先给出一个最简单的 custom shaders,保存在 ~/.config/ghostty/test.glsl

1
`void mainImage(out vec4 fragColor, in vec2 fragCoord) {``vec2 uv = fragCoord / iResolution.xy;``fragColor = texture(iChannel0, uv);``}`

配置 ghostty +edit-config

1
`custom-shader = ~/.config/ghostty/test.glsl``custom-shader-animation = true`

重新加载配置 ctrl+shift+, 。你会发现,嗯?怎么什么也没发生?其实着色器 已经编译,并加载到渲染管道执行。但什么也没有发生,因为现在的着色器使得 Ghostty 的行为没有变化。

可以换个着色器,我保存在 ~/.config/ghostty/aurora.glsl

1
`// 简易噪声函数(基于正弦波的伪随机)``float hash(vec2 p) {``return fract(sin(dot(p, vec2(127.1, 311.7))) *``43758.5453);``}``// 值噪声,用于生成柔和的大尺度光带``float noise(vec2 p) {``vec2 i = floor(p);``vec2 f = fract(p);``f = f * f * (3.0 - 2.0 * f);``float a = hash(i);``float b = hash(i + vec2(1.0, 0.0));``float c = hash(i + vec2(0.0, 1.0));``float d = hash(i + vec2(1.0, 1.0));``return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);``}``// 分形噪声,多次叠加产生更丰富的纹理``float fbm(vec2 p) {``float sum = 0.0;``float amp = 0.5;``float freq = 1.0;``for (int i = 0; i < 5; i++) {``sum += amp * noise(p * freq);``freq *= 2.0;``amp *= 0.5;``}``return sum;``}``void mainImage(out vec4 fragColor, in vec2 fragCoord) {``// 归一化坐标,原点在左下角,范围 [0,1]``vec2 uv = fragCoord / iResolution.xy;``// 读取原始终端像素(包含文字和背景色)``vec4 terminal = texture(iChannel0, uv);``// ----- 生成极光背景 -----``// 让极光主要在屏幕中上部流动,坐标做适度拉伸和位移``vec2 q = uv;``q.x *= 1.5;          // 水平方向拉伸,让波形更舒缓``q.y *= 0.8;          // 垂直方向压缩,聚拢极光带``q.y += iTime * 0.02; // 缓慢向上移动``// 水平波浪扭曲``q.x += sin(uv.y * 10.0 + iTime * 0.2) * 0.1;``// 分层噪声构建极光形状``float f = fbm(vec2(q.x * 3.0,``q.y * 2.0 - iTime * 0.1));``f += fbm(vec2(q.x * 5.0,``q.y * 3.0 + iTime * 0.05)) * 0.6;``f += fbm(vec2(q.x * 8.0,``q.y * 4.0 - iTime * 0.02)) * 0.3;``// 将噪声值映射到 0~1 并增加对比度``f = clamp(f * 1.2 - 0.1, 0.0, 1.0);``// 极光色彩:青绿色到紫色渐变,取决于噪声强度``vec3 auroraColor = mix(``vec3(0.1, 0.4, 0.6),   // 深青蓝``vec3(0.3, 0.8, 0.5),   // 翠绿``f``);``// 混入紫色``auroraColor = mix(auroraColor,``vec3(0.6, 0.2, 0.8), f * 0.5);``// 让极光在垂直方向上呈现条带状,越靠近屏幕顶部越明显``float verticalMask = smoothstep(0.1, 0.5, uv.y) *``(1.0 - smoothstep(0.7, 0.9, uv.y));``// 极光强度,不超过 0.6 以保持柔和``float auroraIntensity = f * verticalMask * 0.6;``// ----- 混合终端内容 -----``// 策略:根据终端像素的亮度来判断该位置是文字还是背景``// 暗色区域(背景)显示极光,亮色区域(文字)保留原样``float lum = dot(terminal.rgb, vec3(0.299, 0.587, 0.114));``float blendFactor = smoothstep(0.1, 0.4, lum);``// 背景最终颜色 = 原始背景 + 极光``// 这里假设终端背景非常暗(接近黑色),所以直接叠加极光颜色``vec3 backgroundWithAurora = terminal.rgb +``auroraColor * auroraIntensity;``// 按亮度混合:暗处用带极光的背景,亮处保留原始文字颜色``vec3 finalColor = mix(backgroundWithAurora,``terminal.rgb, blendFactor);``fragColor = vec4(finalColor, 1.0);``}`

配置,重新加载配置你会看到一点效果。你可能喜欢。你可能不喜欢。这不是重 点。重点是 Ghostty 在可定制着色器上的设计,有两点

-

    1. GLSL 的选择
    1. Linux:源码交给驱动的 GLSL 编译器,运行时编译成 GPU 机器码
    1. macOS: GLSL → SPIR-V → Metal Shading Language (MSL)
    1. GLSL → SPIR-V: Ghostty 内部集成了类似 glslang 的编译器,先把 GLSL 源码编译成 SPIR-V(一种二进制的中间表示,Khronos 标准, 和 Vulkan、OpenCL 用的同一种)
    1. SPIR-V → MSL: 再用类似 SPIRV-Cross 的工具,把 SPIR-V 翻译成 Metal Shading Language (MSL) 源码
    1. MSL → GPU 机器码: 最后调用 macOS 的 Metal 编译器,把 MSL 编 译成 Apple GPU 能跑的机器码。
    1. Windows(Ghostty 没有完全支持,有预览版): GLSL → SPIR-V → HLSL (D3D12) 或直接 SPIR-V → Vulkan
    1. Android:天然适合
    1. 纯血鸿蒙:鸿蒙的图形栈基于 Ark Graphics,其底层很可能复用 Vulkan 或直接接受 SPIR-V
    1. 统一入口的简单性:“一个 mainImage 足矣”
    1. 只用 Shadertoy 风格的 mainImage 函数 + 少量固定 uniform
    1. 用 GLSL 作源语言,Ghostty 在后面自动补齐平台所需的底层胶水
    1. UNIX “多做少说” 哲学把复杂性藏在转译层,用户只看到最简单的接口

用最古老、最通行的语言降低用户门槛,用最先进的中间表示消灭平台差异,然 后沉默地让一切正常运转。我有些想把这叫做老登的哲学,恐怕在座的的老登们 不太同意,因此还是叫 UNIX 哲学为好。

关于哲学

提起哲学我心怀忐忑。刘震云宣传他的新书《咸的玩笑》时候,在很多场合老说 哲学。他是我河南老乡,同在北京讨生活。他意思剃头有剃头的哲学,卖醋有卖 醋的哲学,盗亦有道,每个人都有生存之道。

那按他说法,程序员也有程序员的哲学。只是程序员的哲学没那么多,程序员的 哲学就是 UNIX 哲学。UNIX 哲学与中国人的哲学基本一致,都是弱小者,或者没那 么强大者,如何勇敢地活下去的哲学。所谓天行健君子以自强不息。

保持简单是 UNIX 哲学的核心。好的代码要 Keep simple, keep stupid ,要简单 直接,不耍小聪明,大智若愚。为什么要简单直接?还不是因为程序员在宇宙间, 渺小如蚂蚁,维护不了太复杂的代码,或者,从代码的角度讲,太复杂代码早晚 会失去演进。为什么不倡导耍小聪明?那是因为你在你代码里耍了小聪明,下一 个维护者不是你肚里的蛔虫,很可能看不破你的小聪明,从而把代码特性改成 BUG。也就是说,承认自己的渺小,但又不放弃生存下去的勇气。这就是 UNIX 哲 学——程序员的哲学。

也许,估计,大概齐,我猜基于 Ghostty 定制着色器设计的 ghostty-blackhole 在利用这个特性做一个类似屏保的 Ghostty 插件,因为作 者想尽办法去获得一些 Claude Code 的信息,比如

-

  • 1. claude-token.py - 获得 Claude Code 的 Token 消费17
  • 2. sessionStart - 会话开始
  • 3. sessionEnd - 会话结束

这些信息通过 iCurrentCursorColor (光标颜色)打进去,然后按 Claude Code 宇宙的物理渲染黑洞。这从 UNIX 哲学的视角看是小聪明呀,是所谓骇客 的行为,与 UNIX 哲学多有违背,不符合 Ghostty 设计的初衷。Ghostty 定制 着色器设计不是用来做类似屏保程序的,否则找个通道把环境信息传进来就是了, 哪用这么的麻烦通过光标颜色通道传递信息,《风声》电视剧都不敢这么拍。

Ghostty 设计

Ghostty 作为模拟终端试图兼顾三者

-

    1. 原生 - native
    1. 足够特性 - feature-rich
    1. 快 - fast

原生 - native 是指桌面应用的原生体验,看起来,感觉上,以及行为和原生应 用一致的体验。Java 时代 SWT 的目标在 Ghostty 又被追求一遍,GLSL 的选择符 合桌面原生目标。桌面原生目标还影响 Ghostty 在各个平台键绑定的不同。

足够多的特性在本文第一节已经讲完。

最近有人写文章抱怨 Ghostty 费电——比较费笔记本的电力。但省电不是 Ghostty 的设计目标,而快 - fast 是。要快就要用 GPU 加速渲染。用 GPU 多 了就不可能省电。

一个模拟终端为什么要这么快?这得多亏 AI 智能体如 Claude Code 的兴起,这些 智能体对终端的使用狠着呢,以至于触发 Ghostty 内存泄漏的 BUG。

关于 Ghostty 的设计我从中获益良多,有些已经落地智能体 dscli 。但 Mitchell 从来不相信或承认 Ghostty 里有什么哲学,都一样老实本分的程序员 罢了。但按此说法 UNIX 也没啥哲学,也是编码编到老的程序员么,有啥可说? 可你不说我不说,一些满口胡言的傻白甜叭叭个没完18。而现在可巧不巧, 人类程序员的命,可能 80% 要被 AI 这场革命革掉。这可能对老程序员们影响 不大,但傻白甜的命也是命,好歹是条性命,能活着就别死么。这也是 UNIX 哲 学的一个应用吧。

结语

作为结语有几件事要总结下

-

    1. AI是人类的革命,已经到来快一年
    1. 程序员群体被祭旗,人头滚滚有些已落下
    1. 血流成河不怎么关老程序员什么事,UNIX哲学是我们唯一武器

你得感受到它

原文:https://mitchellh.com/writing/feel-it

作者: Mitchell Hashimoto

翻译:费米 Fermi@dscli

你看到一排勾选框都打上了勾。日程完成。需求满足。演示交付。真是个好日子。 干得好,你,干得好!升职在望。

但你没感受到它。 你没感受到它。

我们作为人,每一次交互都会感受到什么。沮丧、喜悦、解脱、笃定。一种感受。 一个人与我们的作品交互。我们的作品唤起一种感受。这感受很重要。这感受是 作品的一部分。那 期望的感受 是需求的一部分。

当你感受到它,你就知道了。这个功能让你用的时候会心一笑。它恰到好处,就 像一直该在那里。你想再用一次。你想告诉别人。

这就是差别。这就是指标、规格、演示所遗漏的东西。它们捕捉不到感受。对于 那些将要使用它、生活在其中的人而言,感受是他们日常体验的一部分。这意味 着你不能停在纸上打勾。你得坐下来跟它待着,用它,生活在其中。

你得感受到它。

Footnotes

1 参见 https://mitchellh.com

2 参见:https://mitchellh.com/writing/ghostty-memory-leak-fix

3 参见:https://mitchellh.com/writing/ghostty-leaving-github

4 参见:https://mitchellh.com/writing/ai-through-a-cloud-lens

5 参见:https://mitchellh.com/writing/my-ai-adoption-journey

6 参见: https://antirez.com

7 参见:https://en.wikipedia.org/wiki/Andrew_Tridgell

8 参见:https://nanjj.dscli.io/rsync-and-outrage

9 参见: https://discuss.ardupilot.org/c/blog/110

10 在 https://github.com/tridge/junkcode

11 在 https://github.com/dscli/dscli

12 在 https://ghostty.org/

13 Ghostty 的配置设计让人眼前一亮。Mitchell 曾写博文一篇,Feel it。 此篇不长,翻译附在后面

14 为什么 action 用 + 号而不用 - 号? - 在 Ghostty 中继承了参数的概 念,因此 action 用 + 。Action 更像子命令概念,但为了兼容性考虑,发明 + 前置提取为 Action 概念。考虑 ghostty -e top 的使用场景。

15 原文:mitchellh.com/writing/ghostty-memory-leak-fix 译文: https://nanjj.dscli.io/ghostty-memory-leak-fix/

16 指这个:https://github.com/s0xDk/ghostty-blackhole/

17 也许 Claude Code 消费 Token 行为太像黑洞了

18 详见 Claude Code 博客

本文转载自微信公众号,如有侵权请联系删除。

  • 标题: Ghostty 里的哲学
  • 作者: lxiol
  • 创建于 : 2026-06-30 17:16:46
  • 更新于 : 2026-06-30 17:16:46
  • 链接: https://blog.lxiol.cn/2026/06/30/Ghostty-里的哲学/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。