CatCoding

Winlane:我的 Mac 工具箱,按需自制

2026-09-23

我在 macOS 上日常用得最多的软件是 contexts,这是一个窗口 switcher,但这个软件似乎好几年都没更新了。我之前还发邮件去问过作者,他回复说一切都工作得很好,也没有什么新功能想法,所以就一直没更新。

然后某天我看到有的人用 Rust 实现了跨平台的输入法,于是我就起了个新坑,尝试用 AI 来帮我重新实现类似 Contexts 的工具,整个过程比较顺利,项目代码在 Winlane

Contexts 有很多配置项,但我只用它最核心的窗口切换功能。而做完这些基础功能之后我又忍不住继续把我日常依赖的一些小工具都重新实现成了 Winlane 里面的命令。主要有:

  • Raycast: 这几乎是大部分人的选择,但我只用其中的部分核心功能,而 Raycast 的新版本越来越臃肿。我在 Winlane 里面实现了以下几个功能 (也许未来还会尝试兼容 Raycast 插件,但我目前好像对此需求不大):
    • 查找应用和文件
    • clipboard history
    • snippets
    • application shortcuts
    • quicklinks
    • open recent VS Code projects
    • browser history
    • emoji picker
  • Caffeine:需要时让 Mac 继续保持运行一段时间,避免休眠
  • Scroll Reverser: 让鼠标滚动的方向更自然
  • ShowyEdge: 在屏幕上用自定义颜色的图形持续提示当前输入法
  • InputSourcePro: 为每个应用设置默认输入法,这样就能减少手动切换输入法的次数

winlane 集合了这么多功能,而内存只占用 100 来 MB,我可以删掉这几个 App 了:

整个应用开发的过程中,没遇到什么麻烦的地方,倒是在两个小细节上反复折腾了几轮。

第一个是界面的响应速度。这种工具的响应速度直接影响使用体验,所以进入搜索模式需要立即展示 UI,然后优先使用缓存,异步去更新 items 列表的内容,窗口扫描、应用发现、项目数据库和浏览历史读取、搜索模式的焦点查询都放到后台。⌘Tab 为保证快速切换的准确性,保留有严格超时限制的前台窗口查询,重试留给后台。

另一个细节是,当我在其他应用中使用中文输入法时,按下 Ctrl + I 进入 Winlane 的搜索模式,然后我会迅速开始输入关键词或者 alias 查找窗口或者应用,但这时候中文输入法的候选窗会短暂弹出。虽然不是很影响使用,但是让我这个强迫症很难受。这点在 Raycast 上同样存在,只是既然这个工具是我自己来做的,而我使用过程中注意到了这点,所以就一直尝试让 AI 帮我试各种方案,我想要的就是无缝开始输入。最终这个问题还是彻底解决掉了,主要做了几层处理:

  1. 调整获焦顺序:界面立即展示,先按用户配置准备输入法,再让搜索输入框获得焦点,同时对齐输入框自己的输入法状态。
  2. 缓冲最早的按键:尚未准备好时,暂存按键,准备完成后按顺序处理,避免丢字或乱序。
  3. 英文直接输入:目标是英文等键盘布局、且当前确实处于该输入源时,普通 ASCII 字符直接写入原生输入框,避免旧输入法再次介入。这一步是解决候选窗闪现的关键。

最近我还实现了另外一个小功能 auto-appclose,可以设置任何一个应用和限制数量,当这个应用的窗口数量超过限制时,自动关闭这个应用中最久没有使用的窗口。这个使用场景是 VS Code 打开多个项目的时候,每个项目都是一个窗口,如果我忘记关闭,内存就被多个 rust-analyzer 占得差不多了,所以设置为 3 就非常合适,这个小功能和我给浏览器实现的自动关闭 tab 的插件 auto-tabs 类似,确实解决了我的问题。

所以,目前这个工具有点像是 Windows 上的 PowerToys,就是一些顺手的小工具和配置的集合,如果你也和我一样在乎效率和这些小细节,欢迎尝试和贡献

公号同步更新,欢迎关注👻