对于 Linux, 存在着另一种窗口管理工具:平铺式窗口管理器。常见的 i3、bspwm、gnome等, 都有着各自忠实的用户。
而在MacOS上,窗口管理类应用非常之多——知名度比较高的 Moom、实惠简约的 Magnet、主打模仿 Win 系统的 HyperDock,适合鼠标依赖者的 Window Tiny、Mosaic 等等。但这些用起来都不是很方便。
用过i3或bspwm的小伙伴都知道,像i3这样的自动平铺式窗口窗口管理器真的是给我们的日常使用带来了很多方便。
那在MacOS上有没有类似i3或bspwm这样的窗口管理器呢,答案是肯定的。

yabai : A tiling window manager for macOS based on binary space partitioning

chunkwm : Tiling window manager for macOS based on plugin architecture

以上两个软件都来之同一个作者。

yabai 是比较2019年才发布的,是chunkwm的进阶版本,是作者重新采用C99写的。

yabaichunkwm有什么区别呢?
引用管方的一句话:

yabai started as a C99 rewrite of chunkwm, originally supposed to be its first RC version.

什么是平铺式窗口管理器

与平铺式窗口管理器相对的,是浮动式窗口管理器,也就是 Windows 和 macOS 下默认的窗口管理器。在浮动式窗口管理器下,窗口可以自由移动、自由调整大小,窗口之间可以相互重叠。

而平铺式窗口管理器,能够将窗口平铺在桌面上,窗口之间不能相互重叠。

我在 macOS 下的窗口管理-Devlabs & Wiki

平铺式窗口管理器大多具有如下特点:

  1. 纯键盘操作
    切换活动窗口、最大化/全屏、调整窗口大小、调整布局方式、添加/删除/切换桌面、移动窗口到其他桌面、移动窗口到其他显示器…… 所有与窗口管理的操作,都可以通过键盘来实现。部分窗口管理器甚至不提供鼠标操作,只提供键盘操作。
    虽然通过纯键盘的方式管理窗口,会增加学习和记忆成本。但和 Vim、双拼输入法等软件类似,熟练掌握键盘后,能够大幅度提升窗口管理的效率和操作的爽快感。

  2. 自动进行窗口布局
    在打开较多窗口、使用较大显示器的情况下,使用浮动式窗口管理器,需要花费精力不停切换窗口、调整窗口的大小和位置……
    而平铺式窗口管理器,默认就能按照一定的布局方式,将窗口平铺在桌面上,从而减少手动调整窗口带来的工作量。
    我在 macOS 下的窗口管理-Devlabs & Wiki

  3. 完善的多桌面、多显示器支持
    多数平铺式窗口管理器,对于多个桌面、多个显示器之间的窗口切换都有着完善的支持。如下图片来自 Awesome 官网,从中可以感受到在多显示器环境中使用平铺式窗口管理器的体验:
    使用 Awesome 进行多显示器窗口管理
    我在 macOS 下的窗口管理-Devlabs & Wiki
    (图片来源:https://awesomewm.org/

  4. 高度的可定制能力
    包括 yabai 在内的平铺式窗口管理器,都能够通过配置文件进行丰富的设置,从而更加满足自己的使用习惯。

安装 yabai

注意:为了使 yabai 正常工作,需要在运行 yabai 之前,关闭 macOS 的系统完整性保护(SIP)。请自行了解该操作可能带来的安全风险,如果不确定,建议首先在虚拟机中体验。

下面将介绍使用 Homebrew 安装 yabai, 导入 yabai GitHub 仓库中的示例配置,并安装 skhd 做为 yabai 的快捷键工具的完整过程。更多安装方式,请参考 yabai 的 README 文件。

首先安装 yabai(如果电脑中没有 Homebrew, 请先安装 Homebrew):

brew tap koekeishiya/formulae
brew install yabai
sudo yabai --install-sa

然后安装 skhd, skhd 用于给 yabai 提供快捷键支持:

brew install koekeishiya/formulae/skhd

下载 skhd 和 yabai 的示例配置文件:

curl https://raw.githubusercontent.com/koekeishiya/yabai/master/examples/yabairc --output ~/.yabairc
curl https://raw.githubusercontent.com/koekeishiya/yabai/master/examples/skhdrc --output ~/.skhdrc

启动 skhd 和 yabai 服务:

brew services start skhd
brew services start yabai

第一次启动 skhd 和 yabai 之后,macOS 会提示是否允许两者访问辅助功能。在系统偏好设置中添加权限后,再重启一次 skhd 和 yabai, 在终端中输入:

brew services restart skhd
brew services restart yabai

使用 yabai

基本操作

  1. 移动焦点
    alt - h 向左移动窗口焦点
    alt - l 向右移动窗口焦点
    alt - k 向上移动窗口焦点
    alt - j 向上移动窗口焦点
  2. 交换窗口
    shift + alt - h 与左边窗口进行交换
    shift + alt - j 与下边窗口进行交换
    shift + alt - k 与上边窗口进行交换
    shift + alt - l :与右边窗口进行交换
  3. 其他
    alt - r 逆时针旋转窗口
    alt - a 让窗口拼接显示,消除窗口之间的间隔
    alt - f 全屏显示窗口
    alt - t 让窗口悬浮
    想用默认实现的快捷键,参考skhd默认配置的文件注释。

定制

由于yabai在13寸显示器显示某些应用的最小窗口时比yabai控制的窗口大,即某些应用程序会多出一部分。看起来怪怪的。
我在 macOS 下的窗口管理-Devlabs & Wiki
那我们要怎么解决呢
1、把显示有问题的窗单独放
我在 macOS 下的窗口管理-Devlabs & Wiki
2、使其全屏(alt+shift-f)或悬浮(alt-t)
我在 macOS 下的窗口管理-Devlabs & Wiki

3、使用快捷键打开某个用户,如打开终端Alacritty。只需要在.skdhrc 文件中添加

fn - a : open -na /Applications/Alacritty.app 

4、 应用程序后全屏,在.yabairc中添加
yabai -m rule –add app=SecureCRT native-fullscreen=on

5、部分用户问题如果是在打开时让其脱离Yabai的管理(悬浮),可以在.yabairc中添加

yabai -m rule --add app=QQ manage=off

6、我自定义的规则

yabai -m rule --add app=SecureCRT native-fullscreen=on
yabai -m rule --add app=Cornerstone native-fullscreen=on
yabai -m rule --add app=MacVim manage=on
yabai -m rule --add app=QQ manage=off
yabai -m rule --add app='Surge 3' manage=off
yabai -m rule --add app='CleanMyMac X' manage=off
yabai -m rule --add app=Motrix manage=off
yabai -m rule --add app=Preview manage=off
yabai -m rule --add app='TablePlus' manage=off
yabai -m rule --add app=Xcode manage=off
yabai -m rule --add app=WeChat manage=off
yabai -m rule --add app=BaiduNetdisk_mac manage=off
yabai -m rule --add app="^System Preferences$" manage=off
yabai -m rule --add title='.*Trash*|Copy|Move|Info|Connect|Preferences|.*This Mac*.' manage=off
yabai -m rule --add title='.*Welcome*.|Checkout*.|.*Configurations|Choose*.|Import*.|.*Charges|Tip*.|Rename*.' manage=off