起因:一个重复了无数次的动作
作为开发者,我每天都要在 Finder 和终端之间来回切换。流程大概是这样的:
- 在 Finder 里找到项目文件夹
- 打开终端
- 手动 cd 到那个目录
- 或者右键点击文件夹,选择"服务" → "新建位于文件夹位置的终端窗口"
听起来不算麻烦,但当你一天要重复几十次的时候,就会觉得很烦。尤其是当你在多个项目之间切换,或者需要在不同的子目录里执行命令时。 我想要的其实很简单:在 Finder 工具栏上放个按钮,点一下就能在当前目录打开终端。就这么简单。
为什么市面上没有?
其实不是没有,是有的工具要么太老了(好几年没更新),要么功能太复杂(我只想打开个终端而已),要么就是不支持我用的终端。
我平时用 Ghostty,偶尔也会用 iTerm2。市面上的工具大多只支持系统自带的 Terminal,或者最多加个 iTerm2。对于 Warp、Alacritty、Ghostty 这些新兴终端,基本没什么支持。 既然找不到合适的,那就自己做一个吧。反正也不复杂,就是个小工具。
支持多种终端
既然要做,就做得完整一点。我列了一下市面上常见的终端:
- Terminal(系统自带)
- iTerm2(最流行的第三方终端)
- Warp(最近很火的现代化终端)
- Alacritty(性能狂魔)
- Ghostty(我自己在用)
- Hyper(Electron 做的)
- Kitty(GPU 加速)
- WezTerm(跨平台)
- Tabby(也挺流行)
- Black Box(GTK 的)
一共支持了 10 个。应该够用了吧。
应用会自动检测你装了哪些终端,只显示可用的选项。这样界面不会太乱,也不会让用户选到没装的终端。
一些设计上的考虑
GoToShell 其实是包含了两个 app:一个是主应用,用来配置选择哪个终端;另一个是 Helper,专门用来放在工具栏上。Helper 很简单,就是读取配置,然后打开对应的终端。
为什么不做成菜单栏应用?
有人可能会问,为什么不做成菜单栏应用,而是要放在 Finder 工具栏?
因为使用场景不一样。菜单栏应用需要先点击图标,然后选择功能。而 Finder 工具栏的按钮是一键直达的,点一下就执行,不需要二次操作。
而且,当你在 Finder 里浏览文件时,工具栏的按钮就在眼前,不需要把鼠标移到屏幕顶部。
为什么不支持自定义启动命令?
最开始我想加这个功能,比如打开终端后自动执行 git status 或 ls -la。
但后来想想,这个需求其实不强。大部分时候,我们只是想在某个目录打开终端,然后根据当时的需要执行不同的命令。如果每次都自动执行固定的命令,反而会觉得多余。
而且,不同的终端对启动命令的支持方式不一样,实现起来会很复杂。为了一个不太常用的功能增加这么多复杂度,不值得。
所以最后决定不做这个功能。保持简单,专注于核心功能。
为什么选择 AGPL-3.0 协议?
这个项目是完全开源的,代码放在 GitHub 上。
选择 AGPL-3.0 是因为我希望这个项目能一直保持开源。如果有人基于这个项目做了改进,我希望他们也能把改进分享出来,让整个社区受益。
技术栈
整个项目用 Swift 和 SwiftUI 写的,完全原生。没有用任何第三方库,就是纯粹的 macOS 开发。用原生技术,可以更好地利用 macOS 的 API,比如 NSWorkspace、AppleScript 这些。
一些数据
从开始写代码到发布第一个版本,大概花了两个周末的时间。代码量不大,主应用大概 300 行,Helper 大概 200 行。
最费时间的其实是测试各种终端,确保每个都能正常工作。还有就是写文档,README 改了好几版才满意。
应用体积很小,arm64 版本大概 3MB,x86_64 版本大概 4MB。启动速度基本是秒开,资源占用可以忽略不计。
后续计划
目前这个版本已经能满足我的日常需求了。但还有一些想法可以做:
- 快捷键支持:比如按
Cmd+Shift+T就能在当前 Finder 窗口打开终端 - 右键菜单集成:在文件夹上右键,直接选择"在这里打开终端"
- 更多终端支持:如果有新的终端出现,可以继续添加
- 主题定制:让用户可以自定义工具栏图标
不过这些都不急,先看看用户反馈再说。
写在最后
做这个工具的初衷很简单,就是想解决自己的一个小痛点。没想到做着做着,发现还挺有意思的。
从需求分析、技术选型、代码实现、到打包发布,整个流程走下来,虽然是个小项目,但该有的环节一个都不少。
如果你也是 macOS 开发者,也经常需要在 Finder 和终端之间切换,不妨试试 GoToShell。项目完全开源,代码在 GitHub 上,欢迎提 issue 或 PR。