Lobsters 专访 mitchellh
摘要
对 Vagrant、Terraform 和 Ghostty 的创建者 Mitchell Hashimoto 的深度专访,探讨他对终端的热爱、使用 Zig 构建 Ghostty 的过程以及基于终端的应用程序的未来。
<p><a href="https://lobste.rs/~mitchellh" rel="ugc">@mitchellh</a>(<a href="https://mitchellh.com/" rel="ugc">博客</a>)曾创建 <a href="https://vagrantup.com" rel="ugc">Vagrant</a>、<a href="https://packer.io" rel="ugc">Packer</a>、<a href="https://consul.io" rel="ugc">Consul</a>、<a href="https://terraform.io" rel="ugc">Terraform</a>、<a href="https://vaultproject.io" rel="ugc">Vault</a>、<a href="https://nomadproject.io" rel="ugc">Nomad</a>、<a href="https://waypointproject.io" rel="ugc">Waypoint</a>,现在正在构建 <a href="https://ghostty.org/" rel="ugc">Ghostty</a> 和 <a href="https://github.com/mitchellh/vouch" rel="ugc">Vouch</a>。</p>
<p>在这次专访中,我们讨论了终端、Zig 和开源。</p>
<hr>
<p><strong>你接受过很多采访。为什么人们喜欢采访你?</strong></p>
<p>在采访中,每个人都从不同的角度切入。许多人想了解从软件工程转向创始人思维的过程。其他人则对产品相关的内容感兴趣,比如我在 Hashicorp 或现在 Ghostty 的工作。这次的不同之处在于,我们没有预定的议程;我们都没有什么要推销的。</p>
<p><strong>你觉得终端有什么好玩的?为什么选择 Ghostty?</strong></p>
<p>我花了大约 15 年时间构建 CLI 应用程序(不是我们现在看到的 TUI)。在这个过程中,我偶然学会了如何给文字上色、移动光标等。离开 Hashicorp 后,我想磨练自己的技术技能(因为疏于使用而变得生疏),并专注于:前 AI 时代的 GPU 编程、桌面/单节点系统编程(在分布式系统上花费了太多时间,以至于不用担心缓存局部性或向量运算,因为网络开销占主导地位)。我也非常想尝试一下 Zig。我想满足这三个条件。</p>
<p>在构建 CLI 15 年后,我仍然不了解终端模拟器的工作原理。我知道终端的组件,但真的很想了解它的工作方式,这样我就可以在 GPU、桌面和 Zig 上进行开发。我的目标是让 vim 和编译器在其中运行,让它自举构建,然后丢掉它。但随着对终端生态系统的深入了解,我发现没有任何东西符合我想要的定位:快速、功能丰富且原生跨平台。我在 Discord 上和一些朋友分享了它,他们问是否可以分享给其他人,因为他们每天都在使用。Ghostty 的 Discord 最初只是我朋友的群聊,后来被重新利用了。我不想公开发布,因为我的公众形象会引来太多不必要的关注,所以我长期进行了内测。</p>
<p><strong>我们如何进一步推动终端的发展?</strong></p>
<p>我不支持把终端推向极端。当然,它是一个应用平台,能够做到操作系统之上其他应用平台(如浏览器、旧的 Java 应用运行时环境)所能做到的事情。你可以把所有功能都塞进去:视频和麦克风访问、响应式布局……你可以这么做。</p>
<p>但浏览器擅长某些事情,桌面擅长另一些事情,而基于文本的(等宽网格)应用也有其独特的优势。这些基于文本的应用应该易于实现、交互方便、安全模型清晰。这个生态系统还有很多机会,我很想建立更多的协议来实现这一点。</p>
<p>基于终端的应用程序比其他范式更适合组合。TUI 就不那么适合,但大多数 CLI 工具都有机制(超出标准输入和输出)来像函数一样使用它们(UNIX 的单一职责哲学是极端的例子)。Neovim 和 AI 工具提供了越来越多的命令行标志。一个拥有更好终端应用的世界,就是一个拥有更好自动化和可脚本化能力的世界。</p>
<p>我希望让终端成为应用程序的特别之地。PTY 的带内信令(带有转义序列的非结构化字节流)是一个大问题。Nushell 生态系统试图通过另一层来解决,但我们需要根本性的改进。很多人不喜欢微软的生态系统,但 PowerShell 在结构化数据方面做得很好。</p>
<p><strong>你如何看待非传统终端 API?</strong></p>
<p>我的指引星是,现在我们拥有多个主要的大型应用平台:浏览器、Emacs、整个苹果生态系统、微软生态系统、安卓、视频游戏机平台。这些生态系统各有优缺点,但它们的框架是如何工作的呢?在网络上,是 DOM 和 JS API。在苹果平台,是 AppKit、<a href="https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CocoaFundamentals/WhatIsCocoa/WhatIsCocoa.html" rel="ugc">Cocoa</a> 和 SwiftUI。在 Windows 上,是 Win32、WinUI 等。在 Linux 上,是 GTK 和 Qt 等。当有人说我们需要一种更好的方式来访问剪贴板数据(历史协议只支持文本,而桌面平台几十年来已处理图像、多种 MIME 类型等),我会查阅每个平台的剪贴板管理器文档,看看我们达成了什么共识。我们没有理由在不研究数十年既有成果的情况下,仅凭自己的理解来构建东西。这就是我在这里试图采取的方法。我还没有引入任何自定义协议。</p>
<p>有两个协议让我感到迫切需要。目前,终端有一个主屏幕和一个备屏(有时称为主屏和次屏),具有不同的属性。主屏就像你的 shell,带有滚动历史等;备屏则像 Neovim、大多数 TUI 等。只有两个,你可以打开或关闭模式,进入主屏或备屏(占用整个屏幕,丢失滚动历史等)。</p>
<p>我想引入一个 n-screen API,可以在后台创建和填充无限数量的屏幕,允许你以不同的网格尺寸叠加屏幕等。终端模拟器可以处理换行、选择、路由鼠标事件等。你可以将一个屏幕指定为独立窗口,由终端模拟器在网格之外渲染——想象一下你的 Neovim 标签页同时以原生窗口标签页的形式打开!这个基础层可以解决很多问题。</p>
<p>我还设计了一个按钮协议。目前,有鼠标协议可以在有人点击网格单元格时收到通知。但只能接收到当前屏幕上事件,无法获取历史记录或滚动回的内容……我们已经支持超链接(<a href="https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda" rel="ugc">OSC 8</a>),我希望有类似 OSC 8 的机制,点击时会向程序发送一条消息(由你指定)。你可以创建一个带有 <code>open_profile</code> ID 的按钮,即使用户滚动历史也能注册。这会影响主屏应用(唯一有滚动历史的应用),如 Claude Code。我无意在这里讨论 AI,它只是一个非常流行的主屏应用。一旦内容进入历史,你就无法再打开文件、应用内链接等。</p>
<p><strong>这在多大程度上只是重做整个用户空间?那里有很大的范围蔓延空间。</strong></p>
<p>我尝试过用 Wayland 替换整个 PTY 协议。如果你眯起眼睛看,终端就是一个窗口服务器,管理窗口和窗口上的小部件。我研究 Wayland 是为了让 Ghostty 在上面运行得更好,并认为它对于试图解决的问题(本地桌面、渲染窗口)来说是一个相当不错的协议。但我放弃了那个想法。</p>
<p>终端的一个问题是,<em>现在</em>没有标准制定机构了。有一些旧的规范,是法律上标准化的,但过去 20 年的标准化基于最流行的终端做什么。我们有一堆零散的功能,但没有一个实体在推动有品位的愿景。</p>
<p>我不知道前进的正确道路是什么。你可以为基于文本的应用程序创建一个替代的家园,不再称之为终端,build s</p>
查看缓存全文
缓存时间: 2026/07/09 17:39
# Mitchell Hashimoto 访谈
来源:https://alexalejandre.com/programming/interview-with-mitchell-hashimoto/
与 Mitchell Hashimoto 对话2026年7月 \- Alex Alejandre
---
Mitchell Hashimoto (https://mitchellh.com/) 是Vagrant (https://vagrantup.com/)、Packer (https://packer.io/)、Consul (https://consul.io/)、Terraform (https://terraform.io/)、Vault (https://vaultproject.io/)、Nomad (https://nomadproject.io/)、Waypoint (https://waypointproject.io/) 的幕后推手,如今正在构建Ghostty (https://ghostty.org/) 和Vouch (https://github.com/mitchellh/vouch)\.
在这次访谈中,我们聊了终端、Zig 和开源。
---
**你接受过*很多*次访谈。为什么人们喜欢采访你?**
每次访谈,大家的角度都不同。很多人想知道从软件工程师到创业者的思维转变是如何发生的。也有些人关注产品层面,我在 Hashicorp 做过的工作,或者现在的 Ghostty。而这次的不同之处在于,我们没有预设的议程——你我都没什么要推销的。
**你觉得终端有什么好玩的?比如,为什么做 Ghostty?**
我花了大概 15 年时间构建 CLI 应用程序(不是现在常见的 TUI)。在这个过程中,我无意中学会了如何给文字上色、移动光标等。离开 Hashicorp 后,我想打磨自己的技术能力(因为疏于维护已经变得生疏了),具体想钻研三个方面:AI 之前的 GPU 编程、桌面/单节点系统编程(之前大量时间花在分布式系统上,网络开销占主导,你根本不用担心缓存局部性或向量操作)。另外,我非常想玩玩 Zig。我想同时满足这三件事。
做了 15 年 CLI 之后,我并不真正理解终端模拟器的工作原理。我知道终端的各个组件,但非常想弄懂它到底是怎么运行的,这样我就能同时涉足 GPU、桌面和 Zig。我的目标是让终端里能跑 vim 和编译器,然后让它自己构建自己,最后扔掉。但随着我对终端生态了解加深,我发现没有任何东西能满足我想要的:快速、功能丰富、原生跨平台。我把这个想法分享给了 Discord 上的几个朋友,他们问能不能再分享给别人,因为他们自己每天真的在用。Ghostty 的 Discord 原来只是我朋友的群聊,后来就改造成了这个项目。我不想公开发布,因为我的公众身份会招来太多不必要的关注,所以很长一段时间里我都只做了私人测试。
**我们如何进一步推动终端的发展?**
我不赞成把终端推向极端。当然,它是一个应用平台,能够做到其他基于操作系统的应用平台(比如浏览器、老的 Java 应用运行时环境)能做到的事情。你可以把全部功能都塞进去:视频和麦克风访问、响应式布局……你确实可以。
但浏览器有它擅长的,桌面有它擅长的,文本型(等宽网格)应用也有自己独特的优势。这些基于文本的应用应该能快速实现、易于交互、安全模型清晰。这个生态系统还有很多机会,我很想构建更多协议来支持它。
比起其他范式,终端应用更擅长组合。TUI 在这方面稍弱,但大多数 CLI 工具都有一些机制(超出标准输入输出)来像函数一样使用它们(UNIX 的“只做一件事”哲学是极致体现)。Neovim 和 AI 工具提供的命令行标志越来越多。更好的终端应用世界,就是一个更好自动化、更好脚本化的世界。
我想让终端成为一个特殊的应用场所。PTY 的带内信令(带有转义序列的非结构化字节流)是个大问题。Nushell 生态系统试图用另一层来解决它,但我们需要的是一项根本性的改进。很多人不喜欢微软的生态系统,但 PowerShell 在结构化数据方面做对了很多事情。
**你对非传统终端 API 有什么看法?**
我的指导方针是:我们现在有了多个主要的大型应用平台:浏览器、Emacs、整个苹果生态、微软生态、Android、视频游戏主机平台。这些生态系统各有优劣,但它们的框架是如何工作的?Web 上是 DOM 和 JS API;苹果上是 AppKit、Cocoa (https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CocoaFundamentals/WhatIsCocoa/WhatIsCocoa.html) 和 SwiftUI;Windows 上是 Win32、WinUI 等;Linux 上是 GTK 和 Qt 等。当有人说我们需要一种更好的方式访问剪贴板数据时(历史协议只支持纯文本,那图片、多种 MIME 类型呢?桌面端处理这些已经几十年了),我会去查每个平台的剪贴板管理器文档,看看它们最终采用了什么方案。我们没有理由在不去研究数十年已有成果的情况下,仅凭自己的理解去构建新东西。这就是我在尝试采取的方法。到目前为止我还没有引入任何自定义协议。
有两个协议特别让我想吐槽。目前,终端有一个主屏幕和一个替代屏幕(有时称为主屏幕和次级屏幕),属性不同。主屏幕像你的 shell,有回滚功能等等;替代屏幕像 Neovim、大多数 TUI 等。只有这两种模式:你打开或关闭一个模式,就会进入主屏幕或次级屏幕(占满整个屏幕、丢失回滚等)。
我想引入一个 n 屏幕 API,让你可以在后台创建和填充无限数量的屏幕,允许你以不同的网格大小叠加屏幕。终端模拟器可以处理换行、选择、鼠标事件路由等。你可以指定一个屏幕作为独立窗口,由终端模拟器在网格之外渲染——想象一下,你的 Neovim 标签页变成了本地窗口标签页,同时打开!这个基础层会解决很多问题。
另外,我还制定了一个按钮协议。目前有鼠标协议可以在用户点击网格单元格时收到通知。但接收事件的只能是当前屏幕上的内容,而不是历史记录,也不是滚动回退之后……现在我们支持超链接(OSC 8 (https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)),我想要一个类似 OSC 8 的机制:点击时会发送一条消息(由你指定)给程序。你可以创建一个带有`open_profile`ID 的按钮,即使之后用户回滚历史,点击依然有效。这会影响主屏幕应用程序(只有它们有回滚功能),比如 Claude Code。我无意在这里讨论 AI,它只是一个非常流行的主屏幕应用程序。一旦内容进入历史记录,你就无法再打开文件、应用内链接等。
**这在多大程度上只是重做整个用户空间?这里面有相当大的范围蔓延风险。**
我曾经尝试用 Wayland 完全取代 PTY 协议。如果你眯着眼看,终端就像一个窗口服务器,管理窗口和窗口上的小部件。我研究 Wayland 是为了让 Ghostty 在它上面运行得更好,而且我觉得 Wayland 对于它试图解决的问题(本地桌面、渲染窗口)来说是一个相当不错的协议。但我后来放弃了。
终端的一个问题是,现在*已经没有*标准制定机构了。有一些旧的规范,是法律上标准化的,但过去 20 年的标准化是基于最流行的终端在做什么。我们有的是一堆杂七杂八的功能,没有哪个实体在推动一个有品位的愿景。
我不知道正确的道路是什么。你可以为基于文本的应用创建一个替代主场,不再叫终端,构建一些新的东西(上面加一个终端翻译层来兼容旧应用),尝试做一些不同的事情。
**你如何在这些想法和用户日常需求之间取得平衡?**
我非常公开地表示,开源维护者对用户没有0义务。开源许可证的第一行通常是“按原样提供,无任何担保”。这就是协议:你获得免费软件,不能对它提出要求。但我喜欢努力构建好的软件(可能有人不同意,说我的软件很烂),所以我确实有责任修复问题,让软件变得更好。
有些早晨我醒来,会期望去处理 issue,只解决别人的问题。但有时我醒来,专注于自己想要做的,不读一个 issue、讨论或 PR。有时候,你需要推动更大的愿景;有时候,你需要处理现实中的问题。
你可以在天空中建造一座完美的城市,然后回到现实世界,发现那里充满了恐怖和苦难。所以有时你需要清理一下。
如果我每天只处理用户的 issue,你会得到稳定但停滞不前的软件。如果你接受所有 PR,你会发生变化,但缺乏愿景。我不是要冒犯贡献者,但每几年只有一个人能从根本上理解。大多数贡献只是解决某个人的特定痒点,全部接受会导致代码堆积如山。真正理解了,有时你能发现优雅的系统,能简洁地解决一切问题。
我曾经做过一个功能设计视频 (https://x.com/mitchellh/status/2001810354096214059?lang=en),在那里面我关闭了3-4个不同的功能请求,它们各自解决不同的问题,因为我发现一个单一功能(不同于所有这些)可以同时解决它们。很少有人能做到这一点,不是因为它难,而是因为它需要一种很少有人愿意花在别人项目上的关心程度。
> 我断断续续想了这个问题大概一年(同时还有上百件事,没有专门,我不在电脑前时总是在想这些东西)。当我终于坐下来想“我要解决这个问题”时,也许……1小时?https://x.com/mitchellh/status/2003957851514126510
**更少的功能,更好的组合,会吸引人们走向异域编程范式。这要求很高的视野。**
我最近在网上跟一个人因为我的理念发生过争吵。Ghostty 最被要求的功能之一是搜索,已经完成并发布了。但有人抱怨搜索臃肿,破坏了 Ghostty 的极简主义。我宣传 Ghostty 是功能丰富的!但我会区分这和臃肿。我不认为你应该为你没用的功能付出代价(除了磁盘空间或驻留内存代码外)。我解释了搜索的架构方式:它会占用磁盘空间并被加载到 RAM 中,但不会执行任何东西;如果你不用它,它就是一个免费功能。我希望 Ghostty 是一个可定制、可打磨的终端,能满足人们的需求,但也开箱即用,并在你需要或搜索到它们之前隐藏起来,而不会增加任何成本。
但如果你真的想要那样,那么 fork 并自己维护吧。这并没有要求你做比我要求你做的更多的事。如果你希望我维护一个标志来移除它,我可以要求你维护一个移除了它的 fork。告诉别人“去 fork”常常会惹恼他们。
**很少有人维护自己的补丁等,却要求整个项目迁就他们。这是一种非常丧失自主权的心态,乞求别人做自己很容易做到的事。**
我一直认为应该有更多的 fork,无论是个人 fork 还是维护的 fork。
我确实要归咎于自己,以及一般的风投支持的开源。有整整一代人期望看到高度打磨、有资金支持、有自身观点的项目,拥有网站和付费支持人员(在 Discord、Slack 等上),认为一个开源项目就是一个产品——而且在风投支持的案例中,它确实曾经是一个产品。但这在整个生态系统中是如此微小的一部分。
开源包括分享,但它本质是关于自由和权利。这是开源的核心,定义了 OSI 批准的开源许可证。你可以随意使用、修改和 fork 软件。这些权利中没有任何一条关于稳定性或维护义务。人们责怪维护者发布了安全漏洞,但为什么*你没有*审查那个提交呢?你和维护者有同样的义务去审查提交。但人们让维护者承担这种更高的责任,而他们本可以 fork 并立刻成为维护者。
如果你想要更好的保证,如果你想要有权利责怪别人,那就花钱买软件。当你和供应商之间有客户关系时,你就有权要求一些东西。但在开源中没有任何 entitlements。以你喜欢的方式使用它,这是得到你想要的东西的途径。如果更多人 fork,他们也会对构建者更有同理心。
有时候人们认为我的某个项目是一家公司,或者发送一个 PR 修复了我个人没有遇到的 bug,而我没有合并,因为合并意味着要永远维护它。在个人项目中,我不会合并,因为我没遇到那个 bug。
**消费别人不是产品的东西,你对 Zig 的发展有什么看法?显然你并不介意它还没有 1.0。**
我知道我参与的是什么。我通过编译器补丁进入了 Zig,并且很好地了解了社区。我对其文化、哲学等有很好的理解,所以我不会对任何事情感到不满。
我预计 I/O 的变更会是我们做过的最难的事情之一,但我们还没有开始。
Zig 越来越受欢迎,而 BDFL Andrew 并没有退让,坚持他认为必要的变更,作为下游消费者我挺喜欢这样。0.15 版本相当重要,改变了 writer 接口,因此所有打印内容的东西都受到了影响。但这个 API 确实好了太多。
Zig 正变得越来越好。他们非常注重编译工具,甚至移除了语言特性来提高编译速度,真是令人惊叹。你可以立即构建 lib-ghostty(整个终端),而 Andrew 还觉得这几毫秒太慢了。
我确实认为 Zig 最终会达到 1.0,尽管我觉得还有几年。当 AI 参与时,这就不那么重要了。我希望人们读到这篇文章时知道,我不是 AI 的狂热吹捧者。
在最基本的层面上,我们知道这些神经网络非常擅长模式匹配和模式填充。对于这类语言变更,我展示了如何在多种上下文中做,然后让它画完剩下的猫头鹰。虽然 diff 很大,但 90% 是自动完成的,而我在厨房里。这暗示着一个未来:如果你能解释如何从状态 A 到状态 B,向后兼容的意义就会小很多。
这有点讽刺,因为 Zig 有严格的反 AI 政策,但 AI 减轻了变更给下游用户带来的痛苦。
**你如何设计库和 API?Ghostty 使用了 lib-ghostty。我有个朋友对你库的易用性赞不绝口。除了“用心”之外,你有没有具体的方法来改进它们?**
最具体的方法是在多个社区中使用大量的库。就像学习一门你不会(专业)使用的编程语言一样,跨生态系统使用库会开阔你的视野并让你受益。大学期间,我花了很多时间涉猎冷门语言。我用 Prolog、Haskell、Clojure 甚至 Java 做了很多玩具项目(我从没做过专业的 Java 程序员,所以对我来说很新鲜。我用它写了一个完整的 web 副项目。我不喜欢它,但学到了很多关于构建系统、人体工程学、库、web 框架、web 服务器、应用服务器以及所有这类东西的知识。)每个生态系统都有不同的文化。这种文化当然是人的因素,但它会渗透到他们如何分离库和框架层面的关注点,如何设计那些 API 的外观。很长一段时间,Java 到处都在使用构建者模式,我在其他语言中没见过,但我在 Ruby 中尝试了一下,感觉相当不错。这是一个移植概念的例子。这就是我处理库设计的方式:尝试使用各种生态系统的库。
相似文章
Ghostty: 反思1.0版本的发布
Mitchell Hashimoto 反思了他用 Zig 构建的终端模拟器 Ghostty 达到1.0版本的过程,讨论了项目的起源、成功但富有争议的内测版,以及他对这款终端的愿景。
Libghostty 即将到来
Mitchell Hashimoto 宣布了 libghostty 的计划,这是一个可嵌入的终端模拟库,首先推出 libghostty-vt,这是一个从 Ghostty 中提取的零依赖终端序列解析器。
Ghostty 即将离开 GitHub
Mitchell Hashimoto 宣布,由于持续的中断和挫败感,Ghostty 终端模拟器项目将离开 GitHub,此前他已有18年日常使用经历。
欢迎Ghostty子系统维护者
Mitchell Hashimoto宣布为开源终端模拟器Ghostty新增八位子系统维护者,并阐述了子系统治理模型及项目扩展目标。
开发 Ghostty 的一个非平凡功能
Mitchell Hashimoto 详细介绍了如何使用智能 AI 编码工具为 Ghostty 开发一个不显眼的 macOS 自动更新功能,并逐步讲解了他的每次 AI 会话和迭代过程。