说到 macOS 的窗口管理,大概是少数会令我觉得 macOS 比 Windows 还要 suck 的部分。因此,也有不少人开发了窗口管理的软件,比如很多人首先想到的 Moom 和 Magnet,以及老牌的 WindowTidy(现在升级成为了 Mosaic)。

但实际上来说,这些 app 实现的功能基本都大同小异。本着「能少装一个 app 就少装一个 app」的断舍离心态,于是我开始寻找,有没有一款我已经安装的软件可以替代它们?

于是乎,我又一次「盯」上了 Keyboard Maestro。

一言难尽的官网......

基础玩法

首先,新建一个 Macros,命名为窗口左放。然后点击「New Trigger - Hot Key Trigger」,输入一个快捷键,在这里我设置的是 Shift + A。

然后在下面的动作中,点击「New Action」,在 Categories 中找到「Interface Control」,并在右侧的 Actions 下将「Resize a Window」拖到右边「No Action」的虚线里。

接着点击动作选项下的「Resize by - Move and Resize」,你就会看到熟悉的窗口分布模式了。

Keyboard Maestro 本身提供了九种最常见的窗口排列模式:全屏、左右排列、上下排列和四角排列,基本能够满足绝大部分的窗口排列需求。此外,它还提供了窗口居中、调整窗口大小、移动窗口位置、最大化最小化、全屏、切换到最前等等诸多操作。

硬核玩法

如果觉得还不满意,你还可以选择完全自己手动来定义。

我们继续以窗口排列为例子,选择「Move and Resize - Custom」之后,你就可以手动地调整窗口的大小,并将它放在屏幕的任意一个位置上,甚至可以精确到屏幕像素级。

Keyboard Maestro 为窗口自定义提供了一个专门的 SCREEN 函数,比如下方第一句的「SCREENVISIBLE ( Main, Left )」。那么,函数里的变量代表什么意思呢?

按照 Keyboard Maestro Wiki 的说明,SCREEN ( ) 和 SCREENVISIBLE ( ) 两个函数是专门用来调整窗口大小和位置的,他们的用法如下:

SCREEN / SCREENVISIBLE(索引[编号或名称],坐标)

SCREEN / SCREENVISIBLE(索引[编号或名称],坐标,百分比)

可以看出,SCREEN / SCREENVISIBLE 是函数的主体部分,括号内的三个都是可调整的变量。需要提醒的是,SCREENVISIBLE ( ) 调整的是屏幕的可见部分,不包括菜单栏和程序坞。

变量中的索引可以是数字,比如主屏幕的索引号是 0 ,然后 1、2、3 …… n 是按从左到右方向排列的外接屏幕;索引也可以是特定的名称,如下表所示:

要注意的一点是,如果索引用「0」,那么 SCREEN 命令始终都只会调整你在系统偏好设定里设置的主屏幕里窗口的位置大小,而不会调整其他屏幕窗口的位置大小。而「1、2、3 …… n」可以是主屏幕,也可以不是主屏幕,一切都看你在「系统偏好设置 - 排列」里的安排。

SCREEN 函数还提供了 8 个坐标变量,分别如下:

  • Left(距离屏幕左边距位置)
  • Right(距离屏幕右边距位置)
  • Top(距离屏幕上边距位置)
  • Bottom(距离屏幕下边距位置)
  • Width(窗口宽度)
  • Height(窗口高度)
  • MidX(暂时不明)
  • MidY(暂时不明)

而最后的百分比指的是窗口的偏移量,它是一个可选参数,用来调整窗口要偏移的宽度或高度的百分比。偏移量的方向始终是向右和向下,但允许使用负偏移量来实现向左和向上。

只看这些解释,谁都会懵。所以我们用大白话来举个栗子,比如「SCREEN ( Internal, Left, 10% ) 」的意思,就是只调整 Mac 内置视网膜显示屏的窗口,并将窗口左边缘放置到距离屏幕左边缘 10% 距离的位置。

理解了这个之后,就可以上手试着调整自己想要的窗口排列方式了。

「Move and Resize」里的自定义提供了四个需要填写的参数,从上到下分别是距离屏幕左边缘、距离屏幕下边缘、窗口宽度、窗口高度。参数内同样适用 SCREEN / SCREENVISIBLE 函数的写法。

比如我们要实现三个窗口的左右平铺,就需要三个 Macros,分别来定义左、中、右三个窗口的位置。这里我们以「中」这个窗口的函数设定为例子:

  • → SCREENVISIBLE(Main,Left,33.3%)

在主屏幕上,将窗口左边缘移动到距离屏幕左边缘 33.3%的位置。

  • ↓ SCREENVISIBLE(Main,Top)

在主屏幕上,将窗口的上边缘移动到屏幕的上边缘。

  •  ← → SCREENVISIBLE(Main,Width)*33.3%

在主屏幕上,将窗口的宽度调整为屏幕宽度的 33.3%(屏幕总宽度为 100%)。

  • ↑↓ SCREENVISIBLE(Main,Height)

在主屏幕上,将窗口的高度调整为屏幕的高度。

其他两个窗口的设定也是以此类推。

猜猜哪个是左哪个是右?

这样,我们就纯靠键盘和函数,实现了窗口的自定义排列。

这么做值得吗?

比起其他的窗口管理软件来说,Keyboard Maestro 的价格、方便程度都远不及它们。但为什么还要花这么大工夫去折腾呢?我认为有几点。

  • 你买到的 Keyboard Maestro 不只是一个窗口管理软件,还是一个 macOS 平台上最强大的自动化软件,没有之一;
  • 如果你想学习编程,我认为这是一个很好的函数思维训练方式;
  • 少装一个软件,电脑启动时的加载项可以少一项;
  • DIY 的乐趣,就在于你不断探索,并最终实现它的过程。

当然,值不值得,还是看你自己怎么想了。

参考文档

Manipulate a Window Action:https://wiki.keyboardmaestro.com/action/Manipulate_a_Window

SCREEN:https://wiki.keyboardmaestro.com/function/SCREEN

Keyboard Maestro Wiki:https://wiki.keyboardmaestro.com/Home_Page