惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Azure Blog
Microsoft Azure Blog
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
V
V2EX
PCI Perspectives
PCI Perspectives
Latest news
Latest news
博客园 - 三生石上(FineUI控件)
C
CERT Recently Published Vulnerability Notes
W
WeLiveSecurity
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Palo Alto Networks Blog
T
The Exploit Database - CXSecurity.com
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
WordPress大学
WordPress大学
V
Vulnerabilities – Threatpost
H
Heimdal Security Blog
Attack and Defense Labs
Attack and Defense Labs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hacker News: Ask HN
Hacker News: Ask HN
博客园 - 叶小钗
V
Visual Studio Blog
Jina AI
Jina AI
P
Proofpoint News Feed
罗磊的独立博客
SecWiki News
SecWiki News
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
LINUX DO - 热门话题
Security Archives - TechRepublic
Security Archives - TechRepublic
The Hacker News
The Hacker News
Hugging Face - Blog
Hugging Face - Blog
N
News and Events Feed by Topic
NISL@THU
NISL@THU
T
Tailwind CSS Blog
T
Tenable Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Recent Announcements
Recent Announcements
H
Hacker News: Front Page
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Tor Project blog
宝玉的分享
宝玉的分享
Help Net Security
Help Net Security
S
Security Affairs
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
G
GRAHAM CLULEY

暗无天日

读:AI Agent 安全日志——从可见性与隐私的两难说起 - 暗无天日 AI写作的语言指纹——如何让文字不那么像机器 - 暗无天日 读:50 条 Claude Code 技巧——一个工程经理的六个月使用心得 读:AI 辅助开发为什么让 E2E 测试更有价值 - 暗无天日 读:在Emacs中使用Claude Code(Spacemacs适配版) - 暗无天日 Claude Code 背后的工程哲学——读 Agent Harness Engineering 读:Agent Harness Engineering——AI 智能体不只是模型,还有套件 - 暗无天日 browser-harness:让 AI 直接接管你的浏览器 - 暗无天日 读:Security-First CI/CD —— DevSecOps 自动化实践指南 TIL: 数字小键盘的小数点陷阱与行内算术求值 - 暗无天日 读:Immutability 不是万能药,它是一种权衡 - 暗无天日 Conducty:给 Claude Code 加上项目记忆和并行执行能力 - 暗无天日 读 — GitHub Trending 里的 Claude Code 技能包 读 — Prompt Caching 省钱指南 TIL: Emacs 中那些跟鼠标配合的冷门快捷键 - 暗无天日 读:Anvil——把 Emacs 变成 AI 的工具服务器 读:Emacs 代码折叠终极指南 - 暗无天日 读:Clojure 搭车客指南 - 暗无天日 git推送失败后恢复仓库损坏的完整记录 - 暗无天日 多智能体系统的两个有效模式——以及对 Claude Code 用户的启示 - 暗无天日 用 Org Babel 写 Literate 博文:扩展执行 + 定制导出 proced:Emacs 内置的进程查看器 - 暗无天日 从 proced 定制中学到的 Elisp 模式 读:让 Emacs proced 在 macOS 上显示 CPU 和内存 异步编程的函数着色税 - 暗无天日 链式调用的代价:JavaScript 和 Clojure 的共同教训 - 暗无天日 hyperfine:命令行基准测试工具 - 暗无天日 管道中的变量去哪了?——子 shell 作用域陷阱 - 暗无天日 开源包装器的信任陷阱:四个危险信号 - 暗无天日 程序员愿意为 AI 写文档,却不愿为同事写 - 暗无天日 mktemp: Shell 脚本中临时文件的安全陷阱与最佳实践 - 暗无天日 WSL9x —— 在 Windows 9x 里跑 Linux 内核 6.19 用 ox.el 做你想做的事 —— org-export 高级编程指南 读:Hot-wiring the Lisp Machine —— 用纯 Elisp 构建零依赖的 Org 静态站点生成器 Elisp 性能优化的六个实战教训 - 暗无天日 fcitx5 下 Emacs 无法切换输入法的排查 - 暗无天日 ERT 测试交互命令的三种方式 - 暗无天日 SEM Assistant: 当 Elisp 守护进程遇上 LLM 用 dmsg 给 Elisp 加上结构化调试日志 用 org-habit 追踪非每日习惯 - 暗无天日 Clojure X-Men:当编程语言特性变成超能力 - 暗无天日 TIL: 用 diff-hl 在 fringe 中显示 git 变更 读:llm-test —— 用 LLM agent 驱动 Emacs 测试 TIL: AI 时代的橡皮鸭调试 - 暗无天日 fcitx 启动后键盘输入卡顿的排查 - 暗无天日 TIL: 早期网页的图片热区导航 - 暗无天日 读 Seeing the Whole System 用 Emacs 自动生成每周链接推荐 - 暗无天日 读:ASCII control characters in my terminal 读 What to learn - 暗无天日 Lisp 的括号之痛——一个愚人节玩笑揭开的老伤疤 - 暗无天日 一本书该"线性读"还是"并行读" - 暗无天日 读 How to Monetize a Blog:一篇伪装成变现指南的讽刺文 Python Mock 第三方依赖的四种策略 - 暗无天日 Emacs Lisp 热重载实用指南 - 暗无天日 Prot 的 Emacs 配置哲学 - 暗无天日 TIL: 从直播对谈中学到的三个 Emacs 技巧 - 暗无天日 TIL: 自动使用项目虚拟环境的 Python - 暗无天日 TIL: 让 Help buffer 自动获得焦点 一条命令让本地开发用上 HTTPS —— slim 工具介绍 用 fsck 检查和修复 Linux 文件系统 排查Linux进程"卡死"实战:从strace到gdb全流程 - 暗无天日 PostgreSQL 索引:从基础到你可能不知道的高级用法 - 暗无天日 用 .pdbrc 自定义 Python 调试器 ANSI 转义码的标准化现状 - 暗无天日 终端程序的潜规则 - 暗无天日 PARA Org-mode 测试配置 - 暗无天日 AI越强越辣鸡?控制论说这是必然的 - 暗无天日 AI 越强越需要你盯着——反馈循环实操指南 - 暗无天日 你的AI代理正在偷你的密钥——四种你没想到的泄露通道 - 暗无天日 LLM 在 DevOps 中的三种角色 - 暗无天日 写作风格的反建议 - 暗无天日 反驳本质复杂性——Dan Luu 论为什么《没有银弹》错了 - 暗无天日 文件充满了危险——Dan Luu 谈文件系统的可靠性陷阱 - 暗无天日 AI 时代的 PARA 方法:用 Org-mode 和 AI 打造个人知识管理系统 Linux 数据去重学习笔记 - 暗无天日 创建跨平台 ZIP 文件的隐藏陷阱:Extra Field - 暗无天日 X11 Forwarding 排障指南 - 暗无天日 IP欺骗端口扫描:当别人冒充你去扫描别人 - 暗无天日 Linux 输入栈全景解析:从硬件按键到屏幕响应 - 暗无天日 Unix 系统中那些被埋没的配置开关——以 FontConfig 为例 - 暗无天日 在Linux上限制儿童使用电脑 - 暗无天日 GIF不仅仅是一种图片格式——用GIF流做些奇怪的事 - 暗无天日 Leiningen 学习笔记:Clojure 项目构建与管理从入门到实战配置 - 暗无天日 Google SRE Book 读书笔记 - 暗无天日 yes 管道 head 发生了什么 - 暗无天日 为什么 nohup 在 crontab 中不起作用 Bash中的Indirection与Nameref - 暗无天日 Linux PAM 简介 - 暗无天日 从Linux ISO文件启动计算机 - 暗无天日 用 Bash 打造一个Screen Locker 用GitHub Actions自动构建EGO博客 - 暗无天日 blocking I/O 的作用 - 暗无天日 mobileog 手机端同步提示Error:2 No such file 的解决方法 回收 WSL2 VHDX 文件占用空间 使用 org-mode columnview 生成任务列表 - 暗无天日 Emacs 作为 MPD 客户端 - 暗无天日 移动文件路径却不破坏org file link的方法 - 暗无天日 如何合理的导出help link 成HTML - 暗无天日 笑话理解之Biology - 暗无天日
读:为什么我在终端里待了十年——一个 Emacs 用户的 GUI 观察
2026-05-16 · via 暗无天日

Alcides Fonseca 最近写了篇文章 Why TUIs are back,说终端界面(TUI,Terminal User Interface)正在复兴。他举了 DHH 的 Omarchy 作为例子,说那个系统里三种界面之一就是 TUI。我看完之后的感受是:这说的不就是我吗?

说起来我有资格聊这个话题。2017 年我有一台跑不动图形界面的老 ThinkPad X41,干脆就在纯字符终端下用了很长时间,收发邮件、浏览网页、听音乐、看视频、看 PDF、管文件全在终端里(详见我的 Linux 终端工具)。后来换了能跑图形界面的机器,主力编辑器还是 Emacs,日常自动化靠 shell 脚本,写代码用 Claude Code,大部分时间还是在终端里。不是我觉得 TUI 有多酷,是真的回不去了。

GUI 怎么把自己搞砸的

Fonseca 的文章梳理了三大平台的 GUI 框架历史。看完只有一个感觉:GUI 框架换得比手机还勤,每换一次就丢点东西。

Windows:从 MFC 到 MAUI,换了一茬又一茬

Windows 的 GUI 框架史就是一部推倒重来的流水账。1992 年 MFC 封装 Win32,然后是 OLE、COM、ActiveX,再后来 WinForms、WPF、Silverlight、WinUI、MAUI。PowerShell 之父 Jeffrey Snover 说过,这些框架的复杂程度,比最晦涩的哲学书还难啃。

问题不只是复杂。每次推倒重来,新框架总会丢掉旧框架的一些能力。Domenic Denicola 总结过:Windows 原生开发是个烂摊子,每个新框架都有缺口,旧框架能做的事新框架做不到。结果就是企业桌面应用干脆不跟了,Electron(用网页技术做桌面应用的框架)成了默认选择。

Linux:设计上就注定分裂

Linux 的 GUI 分裂是写进基因的。GTK 和 Qt 两套框架各干各的,虽然都能跑在对方的桌面环境里,视觉上始终是"凑合能看"的状态。而且 Linux 发行版 × 桌面环境 × 硬件的组合太多了,大多数商业公司根本不做原生 Linux 应用,要么用 Electron 一把梭,要么让开源社区自己搞。

作为一个 Linux 桌面用户,我对这种分裂有切身体会。装个应用,它可能用 GTK,也可能用 Qt,还可能是 Electron。三个应用的菜单栏长得不一样,快捷键不一样,右键菜单不一样。习惯了这种不一致之后,回到终端反而觉得踏实:所有程序的快捷键都是同一套(Ctrl-C 退出、Tab 补全、上下箭头翻历史),行为是可预测的。

macOS:从一本圣经到无政府状态

Apple 曾经是 UI 一致性的标杆。Human Interface Guidelines(人机界面指南)被全世界的 UI 课程引用,Xerox PARC 和 Apple 分别定义了"好的用户界面"应该长什么样。

几十年过去了。Apple 自己开始无视 Fitts 定律(一个关于"目标越大越容易点到"的界面设计原则),把窗口调整按钮做得越来越小,给每个菜单塞图标。macOS 不再是设计师的避风港。

Fonseca 的原文有一句说得挺到位:"当每个应用长得都不一样的时候,如果你在做艺术(包括游戏),那是好事;如果你只是想让用户把活干完,那就是灾难。"

Electron:无奈的妥协

大家都知道 Electron 应用吃内存。Fonseca 说的更具体:他的 Dock 栏里 14 个应用,8 个原生、6 个 Electron(Slack、Discord、VSCode、Cursor 等)。但他最受不了的不是内存,是键盘工作流一团糟。

他举了 Cursor 的例子:你在 agent 面板里写完需求,想切到侧边的 agent 列表,纯键盘能做到吗?能归档一个 agent 吗?在原生 macOS 应用里,这些操作都有标准快捷键,而且在菜单栏里显示。Electron 应用里,快捷键有没有、是什么、跟系统习惯一不一致,全看开发者心情。

过去十年,Electron 开发者越来越倾向于不给操作加菜单栏入口。因为这些应用本质上是在沙箱里跑网页,开发者忘了(或者根本不知道)原生应用该有的交互规范。

Slack 是这里面做得最好的,但也不完美。作为一个终端为主、偶尔切到浏览器查资料的人,我倒不太受这个罪。但每次从 Emacs 切到浏览器,复制粘贴的快捷键还好,想用 Ctrl-A 跳到行首却发现选中了整个页面,这种瞬间的错位感很难受。反过来看终端,不管是 less 还是 htop 还是 python REPL,Ctrl-C 永远是中断,q 永远是退出。这种一致性没有哪个框架专门设计过,是终端程序四十年来积累的惯例,我之前在终端程序的潜规则里详细写过。

TUI 为什么"自动胜出"

Fonseca 的结论是:原生 UI 工具链搞不定的事,TUI 捡起来了。

TUI 快、可以自动化、在不同操作系统上表现一致。你可以远程运行,不用折腾 X forwarding(在远程机器上显示图形界面的技术)。Claude 在命令行上取得了巨大成功,原因很简单:你专注于交互本身,不用操心底下的操作系统是什么。我可以从笔记本 SSH 到远程服务器上操作,体验和本地差不多。

对我来说,TUI 的优势不需要别人总结。Ctrl-C 退出、管道组合、远程无脑连,这些我已经用了十年。但读了 Fonseca 的文章才意识到一件事:我一直留在终端里,原因可能很简单,GUI 框架在过去三十年里把自己搞成了现在这个样子。

回头想想,也许不是 TUI 有多好,是 GUI 实在没给自己争气。