你的终端里,住进了一个黑洞
上周,一个叫 s13k_ 的开发者在 X 上发了段十几秒的视频,把程序员们看愣了。
他在自己的终端里养了一个黑洞。不是比喻。就是字面意义上的黑洞——有事件视界、有光子环、有吸积盘,连引力透镜造成的色差(蓝光偏折比红光多一点)都做出来了。

更狠的是:这黑洞是活的。你敲键盘,它就在屏幕上方慢悠悠地漂;你连续工作 55 分钟不停,它从一个小黑点长成一颗吞噬一切的黑太阳。直到它大到——说真的——你没法继续无视它。你不休息。它就变大。
然后你站起来,去倒杯水,上个厕所。
回来一看,它小了。
作者自己对网友的解释:"是的,因为这个微不足道的问题跟宇宙的浩瀚比起来根本不算什么,这让人产生存在主义恐惧。那个网友说得太深了,确实也是——与其被生产事故搞崩心态,不如被宇宙的伟大教育一下。"
这项目叫 ghostty-blackhole,开源在 GitHub 上,MIT 协议,随便用。
底层是一个两百多行 GLSL 代码的 shader,跑在 Ghostty 终端里。Ghostty 是 HashiCorp 联合创始人 Mitchell Hashimoto 做的现代终端模拟器,从 1.3 版本开始支持自定义 shader——也就是你可以往终端渲染管线里注入自己的图形代码。这个黑洞就是基于这个能力写的。
它凭什么知道你该休息了
好,最妙的部分来了。
一般的 Pomodoro 番茄钟工具,要么是个倒计时 App,要么是个浏览器插件,再不济是个 shell 脚本。它们都有一个共同点:需要你主动开启,需要后台跑一个守护进程,需要你"守规矩"。
这个黑洞什么都不需要。
它的整个休息提醒逻辑,完全写在 shader 代码里。Shader 是什么?是一段在 GPU 上跑的、没有记忆的代码。每一帧渲染完,所有变量归零,没有地方存"你已经工作了多久"这种状态。
那么问题来了:一个没有记忆的程序,怎么知道你该休息了?
作者的解法很聪明:它不看你的工作时长,它看墙上的钟。
重点:整个 Pomodoro 完全自包含在 shader 里——没有守护进程,没有 shell hook,不读写任何文件。
Ghostty 1.3 给 shader 提供了一个叫 iDate 的 uniform 变量——就是当前的墙上时钟(年/月/日/时/分/秒,精确到秒)。黑洞的成长逻辑很简单:
每个整点小时的第 0-55 分钟是工作期:黑洞从零点开始慢慢长大,55 分钟时长到最大 第 55-60 分钟是休息期:黑洞在最后一分钟迅速塌缩,然后保持微小状态 5 分钟 到了下一小时,循环重新开始
默认配置是 55+5。所以按理说,每个整点前的最后五分钟,就是你被黑洞赶出终端的时间。

还没完。它还会检测你是不是真的在干活。
Ghostty 1.3 还给了一个 iTimeCursorChange——记录光标最后一次变动的时间。如果你 90 秒没碰键盘(默认值 IDLE_FADE_SEC),黑洞会自动缩小。摸鱼去刷手机了?黑洞不烦你。你真的在肝代码?它一秒一秒长给你看。
这比任何番茄钟 App 都诚实。App 只知道你开了计时器,不知道你是不是真的在工作。黑洞知道。
三步把它装进你的终端
好,如果你用的是 Ghostty,我们来把它跑起来。(似乎不适用于windows系统哦。)
先说明:这不是开箱即用的浏览器插件。需要一点命令行操作。但总共就三步,配好之后每次使用完全不用管。
这章的每步操作,读完跟着做就能跑通。不跳步,不脑补。
第一步:确认你有 Ghostty 1.3+
这步的目的:黑洞依赖 Ghostty 1.3 新增的 shader uniform(iDate 和 iTimeCursorChange),老版本跑不了。
打开你的 Ghostty,看看版本号。如果还没装 Ghostty,去 ghostty.org 下载——macOS 和 Linux 都有。
装好之后,确认你的配置文件位置:
macOS: ~/Library/Application Support/com.mitchellh.ghostty/configLinux: ~/.config/ghostty/config
如果这个文件不存在,新建一个空文本文件就行。
这一步最容易踩的坑:macOS 上 Ghostty 的配置路径和大多数 Linux 风格的工具不一样,不是
~/.config/ghostty/。上面两个路径照着写,一个字都别改。
第二步:克隆仓库
这步的目的:把黑洞的 shader 代码下载到本地。
git clone https://github.com/s0xDk/ghostty-blackhole.git
完事之后你得到一个 ghostty-blackhole 文件夹,里面最重要的文件就是 blackhole.glsl——整个黑洞就在这一个文件里。
记住这个文件夹的完整绝对路径,下一步要用。比如 /Users/你的用户名/ghostty-blackhole/blackhole.glsl。
第三步:改两行配置
这步的目的:告诉 Ghostty "加载这个 shader,并且每一帧都刷新它(因为黑洞是会动的)"。
打开第一步说的 config 文件,加入这两行:
custom-shader = /完整路径/ghostty-blackhole/blackhole.glsl
custom-shader-animation = true
第一行指定 shader 文件位置。第二行开启动画——没有这行黑洞就是静止的,不会长大也不会漂。
保存文件,然后 cmd+shift+,(macOS)重载配置。打开一个新的终端窗口,黑洞应该已经在那里了。
配好之后,每次使用只需要做一件事:打开 Ghostty。黑洞会自己在每个小时的第 0-55 分钟慢慢长大,第 55 分钟催你休息。
装好之后:调教你的黑洞
跑起来了?这里是你第一次上手最可能用到的几个操作:
调大小和强度:打开 blackhole.glsl,文件最上面有一排常量,改了立刻生效(cmd+shift+, 重载)。
HOLE_RADIUS // 黑洞最大尺寸(屏幕高度比例)
LENS_STRENGTH // 文字被扭曲的程度
DRIFT_SPEED // 黑洞漂移速度
WORK_AREA // 屏幕底部保留不扭曲的区域(你的输入行)
改完一个值就重载一下配置,效果即时可见。不想手动改文件的,可以用仓库自带的 tune.py——一个交互式调参脚本,键盘上下调数值,终端实时刷新。
改作息节奏:默认 55 分钟工作 + 5 分钟休息。如果你习惯 25+5 的番茄钟:
WORK_PERIOD_MIN = 25.0 // 原来是 55.0
BREAK_MIN = 5.0
支持小数。想改成 45+10 也没问题。
关闭黑洞:把 config 里的两行删掉或注释掉,重载——黑洞消失。
TIME_SCALE是测试用的加速开关。设成 100,36 秒就能看完一个完整的 55+5 周期——黑洞从出生、长到最大、塌缩、休息,快进给你看。看完记得改回 1。
辅助命令不逐个展开了——想看完整参数列表的去原 README,那里有全部 11 个可调常量和完整的 Ghostty uniform 说明。
这个工具比较适合的人:在终端里待的时间比在浏览器里还长,并且觉得"被黑洞赶去休息"比"APP 弹通知催你休息"有意思一百倍的开发者。
把随机想法拼在一起
有人问作者:"怎么才能像你这样有创意?昨天看到有人把公司股价做成赛车游戏,还有把 GitHub 贡献图画成 3D 热力图的,你们这些人到底怎么想出来的?"
作者的回答只有一句话:
"试着把随机想法组合在一起。"
没有方法论,没有思维框架,没有"创意的五个步骤"。
黑洞物理学 + 番茄钟 + Ghostty 的 shader 能力。三个东西看起来毫无关系,组合在一起就成了一个两百多行代码的、能让你在终端里感受宇宙浩瀚的休息提醒器。
挺妙的。不是因为它多复杂——恰恰是因为它太简单了。简单到你看到之后第一反应是"擦,我怎么没想到?"
第二反应是:那我的那两个"看起来毫无关系"的兴趣,能不能也拼在一起试试?


发表评论取消回复