大约在2018年以前,macOS 上的窗口管理工具仍然百花齐放,但亦已渐现颓势。
在第一条叙事线上,各种既得利益者和企图分一杯羹的新秀像烤箱里的鱿鱼一样——疯狂内卷:老牌软件 Moom 仍然有一批传教士,但它似乎陷入各种畸形的窗口比例,让人怀疑是否有必要把笔记本电脑的屏幕搞成监控屏幕、铺满那么多窗口;AutoLayout 为代表的一批新软件则开始推广所谓智能窗口管理,宣称可以自动将当前窗口铺满屏幕,但是这种蒙得里安瓷砖画式的、将屏幕空间压榨到一个像素点都不剩的布局1,恐怕只考虑了利用率而完全不管用户是否会患上斜眼症。换言之,这些工具已经高度特化、进入军备竞赛的最后阶段,只为不同而不同,不断通过推出新奇但基本没有用的功能来吸引用户,完全陷入了功能主义。
第二条叙事线人迹罕至。我从一开始就避开所有图形化的窗口管理工具,取道基于 Lua 脚本语言的 Hammerspoon2——刚好在我为数不多的游戏经历中,接触过 Lua 语言。Hammerspoon 让我意识到,窗口管理,主要是调整窗口的大小和位置,而那些华丽到令人发笑的演绎,也不出此道。Hammerspoon 固然太晦涩,但它留给我的“第一性原理”,则在 Keyboard Maestro 中继续发力。
2018年前后,我因故将所有窗口管理工作迁移到 Keyboard Maestro 上,由于其过于全能,当时我宣称,“窗口”(Window)只是窗口管理的中等颗粒度层级,往下还有标签页(Tab),往上则有虚拟桌面(Desktop),并各编写了一系列动作。时过境迁,事实证明标签页管理还是过于细碎,我又转向了 LaunchBar3;但窗口和桌面两个层级,仍然可供 Keyboard Maestro 纵横。
基础的分屏操作
自 OS X(当时的称呼)引入左右分屏功能以降,分屏功能就涤清了异端魔法的身份,正式进入 macOS。但是,Apple 仅提供了最基础的左右分屏,并未在此道上继续深入,macOS 上的探索甚至不如 iPad。这就给窗口管理工具留下发展余地。4
从最经典的各种分屏操作入手,最容易理解窗口管理是什么——前面也已经提过了——调整窗口的大小和位置。本质就是这两项参数。我提供的示例动作也非常传统,典型的用法就是左边阅读材料、右边做笔记。所涉 Macro 如下:
- 通过快捷键
⌃Control-⌥Option-⌘Command-<
,将窗口分配到左边半屏; - 通过快捷键
⌃Control-⌥Option-⌘Command->
,将窗口分配到右边半屏; - 通过快捷键
⌃Control-⌥Option-⌘Command-?
,将窗口移到屏幕正中间; - 通过快捷键
⌃Control-⌥Option-⌘Command-"
,恢复窗口到上一步的位置(未避免复杂化,仅记忆一次操作)。
分屏操作最重要的是 Move 和 Resize 两步,前者控制窗口位置,后者决定窗口大小——这是一道再简单不过的几何题。以将窗口铺满左半屏为例,需要先用 SCREENVISIBLE
Token 获取当前屏幕的长宽数据,然后稍加换算,得到所需的座标以及尺寸:
SCREENVISIBLE(Front,Left)
:当前屏幕最左侧的横座标;SCREENVISIBLE(Front,Top)
:当前屏幕最上边的纵座标;SCREENVISIBLE(Front,Width)*50%
:当前屏幕宽度的一半,即“半屏”,*50%
这个表达式就是取一半的意思;SCREENVISIBLE(Front,Height)
:当前屏幕的高度,左半屏布局仅是宽度取一半,高度仍然占满。
微调上列中的 Left
、Top
和数值,就能制作出其他的布局,包括设置 1/3、1/4 或者 2/3、3/4 等比例,也不一定是左右分,还可以上下分——只要这些比例确实于你有用。我有一个占满屏幕 87% 空间的窗口布局,空出来的一列桌面位置用于放一些临时文件,比如用 Safari 检索文献时,下载下来的文件就会自动从上到下排到屏幕右侧,如同一个置物架。至于为何是 87%,则是由图标大小(尽可能小)、文字数量(尽可能多)以及文字位置(在图标右边)等一系列要求综合得出的,自下而上,是我重新思考桌面布局的结果,而非从广告商或生产力网红那里领受一个先验的参数。各位不妨突破传统的比例,多多观察自己的真实工作场景,再调配出切实有用的窗口布局。
除了 Move 和 Resize,Keyboard Maestro 还提供更精细的定位工具,可以瞄准特定名称或 ID 的窗口(或标签页),暗示了更加精细的标签页管理。然而,鉴于标签页数量往往巨大,而 LaunchBar 等启动器可以实施索引大部分软件的标签页、超大号列表界面也更惬意,实无必要用 Keyboard Maestro 再造轮子。5
记忆并恢复窗口大小
有时候,分屏结果可能令人不满意,或者干脆就是误按了快捷键6,所幸 Keyboard Maestro 可以设置变量,记住一部分操作历史。7上一节展示分屏操作的动图中,就包含了恢复窗口到上一步状态的 Macro。
既然要记忆窗口状态,仅凭单个 Macro 就不够,而是要在所有窗口管理的 Macro 中——负责恢复的除外——添加记忆窗口位置和大小的步骤。上一节展示左半屏操作时,只有最后一步真正负责操控窗口,前两步均用于获取并存储窗口状态数据:
- 将
%WindowSize%1%
保存到自定义变量WindowSize
,即存下了窗口大小; - 将
%WindowPosition%1%
保存到自定义变量WindowPosition
,即存下了窗口位置。
有两个向量,就能创造世界。有位置和大小数据,就能像像量子传送一样把窗口状态保存在变量中,有需要时再恢复原状。类似保存状态的思路也见诸其他 Keyboard Maestro Macro,例如要动到剪贴板前,我一半都会先保存当前剪贴板中的内容,待其他步骤结束后再恢复剪贴板内容,以避免剪贴板污染。
等比放大或缩小窗口
调整窗口布局,有时候是为了在锱铢必较的笔记本电脑屏幕上合理分配屏幕空间,但也有时候是单纯为了照顾视觉效果。IINA 播放器有一个绝妙的设计,即通过双指开合控制当前窗口大小,轻轻松松就能获得一个舒服的尺寸,而不需要用光标去点窗口边角——一般都会开枪开错,点到背后的窗口。
双指手势那么奢侈的操作,Keyboard Maestro 不敢想,但快捷键还可以一试,至少远远好过扮演一个使用触控板或鼠标的蹩脚狙击手。我设计了一组 Macro,分别以 10% 为单位,等比放大或缩小当前窗口大小:
- 用快捷键
⌃Control-⌥Option-⌘Command-加号
,等比放大当前窗口; - 用快捷键
⌃Control-⌥Option-⌘Command-减号
,等比缩小当前窗口。
注意,由于像素只能是整数,故缩小时 Keyboard Maestro 会取整,导致有个别像素点的偏差,下面的动图先缩小、后放大,尺寸就没有完全恢复原样。话说回来,本文的缩放操作本就旨在模仿手势、代替光标,而这两者本来也都不擅长像素严格的操作。
缩放功能特别适合预览工具和 Quick Look——没错,Quick Look 的窗口也是可以调整的——这俩兄弟永远记不住你常用的窗口布局,总是根据当前图片或 PDF 的实际大小调整窗口,导致一些高分辨率文件直接撑满整个屏幕,而分辨率不佳的内容则直接缩成袖珍玩具,两者都有碍正常阅读和观看。遇上畸大或畸小的窗口,就可以连按几次快捷键,迅速获得适中的尺寸。
切换桌面以及在桌面之间移动窗口
桌面是比窗口更高的管理层级,一个桌面可以容纳多个窗口,正如在几张不同的书桌上存放不同的参考资料和文稿。切换桌面以及在桌面之间移动窗口,主要还是利用 macOS 自带的切换快捷键,Keyboard Maestro 只是提供跳板、简化操作。
完整方案由 Keyboard Maestro 论坛上的 Tom 提出,即便出于介绍目的,我也不应该在一本收费作品中大篇幅引用他人作品,故此处仅展示效果,欲获取相关 Macro 者请阅读原文。
关键在于,无论在左右桌面中移动窗口还是直接定位到特定桌面,都需要使用系统级的 Mission Control 快捷键,Keyboard Maestro 其实是通过一系列键鼠模拟,模仿了手动拖动窗口的过程,与前几节依靠 Token 的做法截然不同。
这或许就是 Keyboard Maestro 的魅力。在绝大多数窗口管理工具偃旗息鼓的桌面切换领域,Keyboard Maestro 虽然没有提供直接的工具,却可以模拟人类操作解决问题。
- 在近几代的 macOS 中,完全压榨像素点已经不可能了,因为 Apple 引入了更显眼的圆角窗口设计,以至于屏幕上总有不少空隙。 ↩
- 在读大学之前我没有属于自己的电脑(iPad 不算),只能借用家人的,因此并不在意窗口管理问题。在这一点上,窗口管理就像是虚拟空间中的房屋精装修,唯有拥有所有权之后,才有必要考虑。我早就不用 Hammerspoon 了,但是大量早期杂文配图中仍然可以瞥见它的小图标。 ↩
- macOS 本身也增加了一些切换窗口的快捷键,以至于当时我做的跳板类快捷键不再有必要。 ↩
- 这一改进并无革命性的效果,尽管从历史上看,分屏其实撬动了 macOS(OS X)十年未动的窗口管理城门。后来直到 macOS Ventura,Apple 才有另一次尝试—— Stage Manager,但个人认为这只是 macOS 和 iPad 的最小公分母,两边都做得非常糟糕。正面评论可参 Eclecticlight 的文章。 ↩
- 造轮子本身不是问题,而要考虑造价以及除了轮子,还能够获得什么。掌握 SCREENVISIBLE 就能制作出各种高度个人化的分屏 Macro,而在 Keyboard Maestro 中钻研标签页管理,则可能收效不大。另外,在早期的杂文中,我就坦言:“Keyboard Maestro 虽然属于全能选手,但是已经在使用其他窗口管理工具的读者不用全盘迁移到 Keyboard Maestro,毕竟已有现成功能的话,实在没必要自己重头折腾,大家可以根据工具的具体短板,用 Keyboard Maestro 进行弥补和辅助,让各个工具协作起来完善 macOS 窗口管理。” ↩
- 重置窗口布局并非小事,布局一变,整个工作节奏都有可能要随之调整——一个在 Stage Manage 模式下漂浮于 27 寸巨型显示器正中央的明信片大小的 Markdown 编辑页面,和一个占据了整个显示器的飞机仪表盘般复杂的窗口,完全不可同日而语——为此,我避免在窗口管理快捷键中使用传统的方向键,以免用方向键和修饰键选取文本时误操作。 ↩
- 严格来说,可以记住全部的操作历史,可一旦来回 Redo 和 Undo,逻辑就容易混乱,故此处从简,只记上一步。 ↩