Featured image of post Yabai

Yabai

macOS平铺式窗口管理器

什么是平铺窗口管理

平铺式窗口管理是相对于堆叠式窗口管理的另外一种窗口管理方式(下图左边是平铺,右边是传统堆叠式),相比于堆叠式,平铺更倾向于将所有的窗口互不遮挡显示最大程度铺满显示器,并且通过快捷键可以非常高效的管理窗口。比如窗口会在打开时自动排列,通过快捷键让窗口快速在不同的工作空间切换,快速切换窗口的位置,如果有多个显示器可以让窗口在多个显示器中流转,以上所有的功能都可以自定义,并且可以通过快捷键完成。

macOS上的平铺式窗口管理–Yabai

Why Yabai

macOS上苹果的封闭生态,以及macOS自带的窗口管理功能相当薄弱,我们还是得用第三方的窗口管理。笔者本人曾经尝试过Magnet或者Hammerspoon等窗口管理器,但是都无法很好的满足笔者本人的需求,Magnet需要手动排列窗口不够方便,Hammerspoon对窗口识别有点问题,最后笔者发现了Yabai这个开源软件,感觉发现了宝藏一样,能在Mac上实现几乎大部分平铺窗口的功能,并且通过shell配置,有丰富的自定义空间。

How to use Yabai

macOS上窗口管理是通过Dock.app实现的,所以Yabai就是通过注入实现对Dock.app的控制从而控制窗口,所以有一些进阶功能需要关闭SIP即系统完整性保护,不过笔者本人没有关闭SIPYabai依旧能满足大部分的需求。

安装Yabai如果用Homebrew那么还是非常简单的在终端输入brew install yabai即可。

接下来我们需要自定义Yabai,我们需要在~/.config/yabai/这个路径下创建一个yabairc文件,作为Yabai的配置文件。这个笔者可以提供自己的配置文件供大家参考https://github.com/xbunax/dotfile/blob/main/yabai/yabairc,我这里简单介绍一下配置文件的功能,不过建议大家看Yabai的官方wiki : https://github.com/koekeishiya/yabai/wiki

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/opt/homebrew/bin/yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa" ##这行命令要放在yabairc的最开头,需要将yabai注入Dock.app

# .. more yabai startup stuff
/opt/homebrew/bin/yabai -m config external_bar all:35:0 ## 设置顶端状态栏的留空
/opt/homebrew/bin/yabai -m config mouse_follows_focus on ## 设置鼠标跟随窗口
/opt/homebrew/bin/yabai -m config focus_follows_mouse off 
/opt/homebrew/bin/yabai -m config window_zoom_persist off 
/opt/homebrew/bin/yabai -m config window_placement second_child 
/opt/homebrew/bin/yabai -m config window_opacity off ## 设置全局窗口透明(此功能需要关闭SIP)
/opt/homebrew/bin/yabai -m config split_ratio 0.50 ## 窗口自动左右分屏的比例
/opt/homebrew/bin/yabai -m config auto_balance off ## 自动左右对称
/opt/homebrew/bin/yabai -m config mouse_modifier fn 
/opt/homebrew/bin/yabai -m config mouse_action1 move ## 设置鼠标动作
/opt/homebrew/bin/yabai -m config mouse_action2 resize
/opt/homebrew/bin/yabai -m config mouse_drop_action swap 
/opt/homebrew/bin/yabai -m config menubar_opacity 0.0 ## 设置macOS原生状态栏透明度

/opt/homebrew/bin/yabai -m config top_padding 5 ## 这里设置窗口平铺的留空
/opt/homebrew/bin/yabai -m config bottom_padding 8
/opt/homebrew/bin/yabai -m config left_padding 8
/opt/homebrew/bin/yabai -m config right_padding 8
/opt/homebrew/bin/yabai -m config window_gap 10

/opt/homebrew/bin/yabai -m config layout bsp ## 设置平铺的方式

当然我们需要将有些窗口脱离Yabai的管理,所以我们需要手动设置脱离窗口管理的白名单

1
2
otherApp='^(IINA|Tencent Lemon| discover |ChatGPT|PlayCover|访达|Calendar|日历|地图|System Preferences|朋友圈|小程序|Downie 4|Shadowrocket|照片|Epson iProjection|系统设置|1Password 7|Android Studio|印象笔记|MATLAB|CrossOver)$'
/opt/homebrew/bin/yabai -m rule --add app="${otherApp}" manage=off

如果需要设置小窗的浮动窗口,我们可以设置

1
/opt/homebrew/bin/yabai -m rule --add label="Wechat" app="^微信$" title="朋友圈|相册" manage=off

当然我们也可以通过Yabai查询窗口信息在终端输入yabai -m query --windows --space <num>可以获取对应space的窗口信息。比如

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
>>> yabai -m query --windows --space 5
[{
        "id":762,
        "pid":16990,
        "app":"Code", ## space 5中所在的app名称
        "title":"dataProcess.m", ## 窗口名称
        "scratchpad":"",
        "frame":{
                "x":8.0000,
                "y":40.0000,
                "w":2528.0000,
                "h":1383.0000
        },
        "role":"AXWindow",
        "subrole":"AXStandardWindow",
        "root-window":true,
        "display":1,
        "space":5,
        "level":0,
        "sub-level":0,
        "layer":"normal",
        "sub-layer":"normal",
        "opacity":1.0000,
        "split-type":"none",
        "split-child":"second_child",
        "stack-index":0,
        "can-move":true,
        "can-resize":true,
        "has-focus":false,
        "has-shadow":true,
        "has-parent-zoom":false,
        "has-fullscreen-zoom":false,
        "has-ax-reference":true,
        "is-native-fullscreen":false,
        "is-visible":false,
        "is-minimized":false,
        "is-hidden":false,
        "is-floating":false,
        "is-sticky":false,
        "is-grabbed":false
}]

我们也可以通过YabaiCLI来控制窗口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
yabai -m space --mirror x-axis ## 翻转x方向的窗口

yabai -m space --rotate 90 ## 将当前的窗口的位置翻转90度

yabai -m window --focus east ## focus到右边的窗口

yabai -m window --swap prev ## 将窗口移动到下一个位置

yabai -m window --toggle float ## 将窗口脱离yabai的管理

....

更多的控制命名可以去查看Yabai的wiki。


当然我们不可能每次都是输入终端命令来使用Yabai,所以我们需要将Yabai的终端命令与对应的快捷键绑定,Yabai的作者提供了skhd这个工具,但是笔者本人用的是Bettertouchtool这个软件,设置起来更加的方便,同样笔者本人也提供对应的配置文件供参考https://github.com/xbunax/dotfile/blob/main/bettertouchtool/exported_triggers.bttpreset BTT

配置完成

经以上配置,在终端输入yabai --start-service就可以将Yabai设置成开机自启动了。

一下是本人的配置演示视频,欢迎三连。

总结

平铺窗口主要是在Linux上使用比较多,适合需要高效的在多窗口之间切换的人群。当然macOS上还有很多其他的窗口管理器,如果实在闲Yabai麻烦,可以使用amethyst这个平铺窗口管理器基本上开箱即用,可以到这里下载https://github.com/ianyh/Amethyst

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy