article_image

窗口管理最艰难之处在于标签页。相信任何一个从事严肃工作或者认真发展业余爱好的读者,都有这样的感受:沉浸心流之中,等回过神来,往往发现标签页早已堆积如山。

或许有人会说,我实在过分扩大了窗口的内涵和外延,属于自找烦恼,然而只要稍微观察一下窗口和标签页的历史——或者扪心自问一下最自然的交互习惯——不难发现,两者完全应该放在一起讨论。现代桌面操作系统大量借用了传统办公用品的隐喻,一个窗口通常对应一个文件夹(马尼拉文件夹),而标签页就像那些纸质文件夹中的独立页面,通常还带有一个抓手,方便写上档案名称或拉着抓手将某一页抽出——这种在纸质通讯录和部分字典中也很常见的设计,便是“标签页”(tab)的由来。1

Alt text
软件窗口和标签页模拟了纸质文件夹

惜乎,或许要怪不同软件对于标签页的认识是在相差太远,或者实现机制大不相同,绝大多数的窗口管理工具都不敢过多讨论标签页管理,反倒是很多浏览器插件专心于优化标签页显示和切换,切中一小块活跃的市场,反而比较吃香(在一个人所接触到的标签页中,来自浏览器的可能占了十之八九)。

但是,多数严肃的工作不可能一天到晚只用一款软;而无论在线服务如何流行,本地软件依然不可替代——否则便宜好看的 Chrome Book 为何没动静了呢——虽然很难马上找到万能工具,但起码在最常用的软件中,应该统一标签页切换效果。在此前的文章《用LaunchBar填上Finder窗口管理的空白》中,我就尝试为 Finder 编写了一个标签页切换工具。

Alt text
用 LaunchBar 导航、定位并显示已打开的 Finder 窗口

后来在断断续续撰写窗口管理新论一文时,我意识到上述方案潜力不小:只要是遵从基本的 macOS 软件开发规范、采用标准的窗口和标签页控件,就有希望使用本方案,为其制作标签页切换工具。

紧接着 Finder 后,我试着为预览工具(Preview)制作标签页切换器。仅次于浏览器和文件管理工具,预览工具在我的工作也是标签页失控的混乱来源,因为我经常阅读大量 PDF 文件2,比如在办案时遇到一个相对深奥的法律条文,我通常要打开条文原文、配套司法解释、最高人民法院出的理解和适用、原文的立法资料、相关的学者评注乃至论文和专著,随随便便就是七八个标签页(或窗口),管理压力绝对不亚于浏览网页或整理文件。

考虑到预览工具和浏览器文件夹一样,同为原生软件,我着手修改之前的插件,果然只需要调整少数代码就可以获得预览工具版的标签页切换器。

Alt text
用 LaunchBar 列出当前所有 Preview 标签页

这套标签页展示和切换的原理倒也简单。所谓的标签页,可是视作文件和软件的特殊组合3,当你用一个软件打开特定文件后,一般来说就会得到一个独立的标签页或窗口,反过来思考,在当前软件中切换标签页的通用思路就是:

  1. 找到当前软件打开的所有文件,列成清单以供选择——具体用什么自动化工具,端视各人品位;
  2. 选好目标文件后,再用当前软件打开一次

当然,大多数软件不会那么笨,重新打开某一文件时通常不会刷新,不至于丢失此前的操作进度,相反,包括 Finder 和预览工具在内的多数原生软件,都只会直接跳到目标文件所在标签页。貌似难以解决的标签页切换问题,实际上就这么简单。

Alt text
用 LaunchBar 切换到任一 Preview 标签页

虽说我的代码专为 LaunchBar 编写,但核心部分是通用的,如果你使用其他自动化工具,只要支持其支持 Python,就有可能移植。4惟需注意,每换一个软件都要制作一个新动作,不过你可以统一 LaunchBar 中同类动作的快捷键,至少日常用起来觉察不到背后的割裂。

话说回来,还有一种完全不需要任何第三方工具的标签页切换方法:快捷键之王,直接在菜单栏的搜索框中查找你想要的标签页,然后敲下回车,就能够跳过去。

Alt text
“快捷键之王”同样可以检索并切换标签页

不过菜单栏搜索框毕竟又远又狭窄,实在不如横在屏幕正中央的启动器类工具直观(无论是本文所用 LaunchBar 还是 Alfred),还夹杂了太多标签页之外的东西(例如最近打开过的文件)。若是不想折腾代码,也可以退而求其次,试试 Keyboard Maestro 版的快捷键之王——这次倒是不得不用第三方工具了——界面大方了许多,但同样无法根除无关项的干扰。

总之,丰俭由人,就原生软件来说,标签页管理难题其实已有各种方案,日后关于窗口管理的讨论,大可不必再躲着标签页。


  1. 当然,标签页也在演进。Obsidian 提供了纵向标签页,被视为一大创新,而这一设计直接来自 Andy Matuschak;但在更早一些时候,MUJI 等生产商也已经在文具中采用了类似的垂直设计。
  2. 由于各种原因,没有机会也不喜欢用 iPad。部分理由可参见《iPad Only 与 Mac Only》
  3. 这个表述貌似晦涩,实则极为精确,我是从 DEVONthink 的博客上借来的。
  4. 准确来说是 Python 和 AppleScript,我在 Python 中嵌套了一段 AppleScript,以便获取当前软件的标签页。至于为何用 Python,则是因为 AppleScript 在近些年总是偷偷变更而毫无提示,导致 LaunchBar 的 Live Feedback 功能多年来无法正常使用,只好套上一层 Python 的壳。

author_avatar

Lawyer, macOS/iOS Automation Amateur