2026年 07月 26日 的归档
Notchy 1.3.7
上次写 Notchy 的时候(从接手到日用:我把 Notchy 改成了什么样),我自以为已经比较完善了,自己想要的功能都有了。但后面自己深度使用以后,包括也有网友反馈,发现还是有不少细节需要打磨。
于是一晃一个半月过去,翻了下 git log,从 1.2.7 到 1.3.7,中间又是 23 个 commit、小一千五百行 Swift,版本号跳了整整十个小版本。。。
趁着 1.3.7 刚发出去,把这段时间攒的东西整理一下:
标签页:从”能用”到”顺手”
上次提到的 Shadow Tab(右键一个 Xcode 或 Pinned 标签页,开一个 cd 到同目录但不启动 agent 的纯 shell)用顺手之后,发现每次都要right-click 选菜单有点烦,于是加了个 Cmd+Shift+T,直接对当前标签页开一个分身。Pin、unpin、开 Shadow Tab 的时候,标签页角上也会弹一个小图标提示一下,不然经常按完不确定到底生效没有。
关掉当前标签页这件事之前也有点反人类:永远跳到”下一个”,跟浏览器的习惯不一样。现在改成关掉后自动回到关之前那个活跃的标签页,一路往回找,符合直觉多了。
标签页多了之后,顺序调整和快速定位就成了刚需。这次加了两个东西:
一是拖拽排序——按住标签页左右拖,松手自动补位,Cmd+1…9 的跳转序号也跟着重新编号,不用再手动数第几个。
二是 Cmd+K 快速切换器:弹出一个按最近使用顺序排列、支持模糊搜索的会话列表,方向键选、回车跳、Esc 取消。做这个的时候踩了个 AppKit 的老坑——SwiftUI 的浮层(QuickSwitcherOverlay)从视图树里移除之后,并不会自动把键盘焦点还给原来的终端,得在 Esc 或选中之后手动调用 makeFirstResponder 把焦点抢回来,否则切换器关了,键盘输入却发不出去,你会以为是终端卡住了。
终端里能像正经终端一样用了
早些版本的终端体验偏”能跑就行”,这轮补了不少 iTerm2 用户会想念的东西。
右键菜单是最直观的一个:复制/粘贴/全选、查词典、拿选中内容或光标下的词去搜网页、打开光标下的 URL、在 Finder 里显示当前工作目录(或复制路径)、清屏。标签页右键菜单也顺带加了”创建检查点”。
深压(force click)一个单词会弹出系统词典释义,跟 Safari 里的 Look Up 一模一样——原理是接进了 trackpad 的 deep-click 二段位移,从 SwiftTerm 的缓冲区里解出光标下的词,再丢给 AppKit 的 showDefinition(for:at:)。
Cmd+点击打开文件/链接这块改动最细,也最容易在细节上翻车。之前直接点会遇到带空格的路径识别不出来、相对路径解析错目录之类的问题。现在带引号的路径(比如截图文件名里常见的空格)能整体识别成一个链接,相对路径按 shell 当前实际所在目录解析(用 proc_pidinfo 拿真实 cwd,不是猜的),像 agent 输出里常见的 Sources/File.swift:12 这种”文件:行号”引用,点一下直接在 Xcode 里跳到对应行。
另外一个不算起眼但天天受益的:流式输出的时候终端选区不再被冲掉了。原来 SwiftTerm 只要收到新数据就会重置鼠标上报状态,顺带清掉你刚选中的文本;现在只有 vim、htop 这类真正需要鼠标事件的 TUI 才会保留上报,普通 agent 输出流不会再打断你复制粘贴。
输入法这次是另一个坑
上次那篇讲的输入法问题,是 SwiftTerm 的 NSTextInputClient 吞掉预编辑文本(打拼音看不到候选字下面自己打了啥);这次修的是另一层——输入法来源(源)在标签页之间的记忆。
现在每个标签页会记住自己上次用的输入法:一个跑着 CLAUDE.md 项目、习惯打中文的标签页,切走切回来还是中文;旁边一个 Shadow Tab 默认停在英文,互不干扰。且只有 Notchy 面板真正拿到焦点时才会去改系统输入法,不会误动其他 App 正在用的输入法。
这个功能刚上的时候有个隐蔽 bug:macOS 的 panelDidResignKey 有时候一次失焦会触发两次,第二次触发时外部输入法已经被恢复了,结果把”外面那个 App 的中文输入法”错记成了这个标签页的输入法,污染了原本该是英文的 Shadow Tab。加了个 idempotent 保护(guard isPanelKey)才算收住。
同一批还加了 Quick Input:自己绑快捷键到预设命令,按一下自动敲进当前聚焦的终端(内置了 Cmd+G → git status),要不要自动回车可以按行配置,在 Settings → Quick Input 里随便增删,也可以整体关掉。
边边角角的细节
一些不太会单独写文章但用起来很舒服的小改动:
Xcode 工程在磁盘上被挪了地方之后,对应标签页现在会自动刷新到新路径——之前是按项目名字匹配的,工程一挪,标签页就一直 cd 到一个不存在的旧目录。
拖动窗口或者用 Cmd +/-/0 缩放字体的时候,HUD 提示会顺带把终端的字符行列数也标出来:
|
1 |
720 × 400 (120×40) |
外接显示器没接的时候,相关开关会自动置灰并给提示,接上拔下都会跟着实时更新,不用再对着一个点了没反应的开关发呆。
还有个不起眼但对 agent 体验有直接影响的:内嵌终端之前没有正确设置 TERM_PROGRAM,claude 这类会识别宿主终端类型的 CLI 只能退回去看原始的 $TERM 值,现在能正确认出自己是跑在 Notchy 里。
顺手修的一堆 bug
这段时间里还有几个纯粹的显示 bug,挑重点提一句:设置窗口以前是 floating 层级,会盖住其他 App 窗口,改成 normal 就好了;改字体大小之后终端字符被滚动条挡住的问题修了;终端往上滚看历史的时候,敲的字没有正确回显到屏幕上的问题也修了——这几个都是 SwiftTerm 底层渲染逻辑的坑,改动细节没什么好展开的,能用就完事了。
—
十个版本攒下来,Notchy 离”能用”更远了一步,离”顺手”近了一大截。想试试的话去 GitHub 下最新的 DMG 或 ZIP。