前言

长期使用Linux的用户应该对 i3wm 并不陌生,它与Mac、Windows这类操作系统悬浮(float)式桌面有着显著差别,这类被称之为平铺(tiling)式桌面。当我得知Mac下的开源项目 yabai 时,我便迫不及待的开始了使用之旅。

安装

设备情况:

已安装Homebrew (可以参照官网)

已关闭SIP

Monterey12.4

最好是参照 官方文档 (英文)进行安装,毕竟官方的是最新最准确的。

下面是自己的过程,记录一下,可供大家参考。

# 安装yabai
brew install koekeishiya/formulae/yabai
sudo yabai --install-sa
# 启动yabai 这时候需要授权辅助功能
brew services start yabai

# 安装skhd
brew install koekeishiya/formulae/skhd
# 启动skhd 这时候需要授权辅助功能
brew services start skhd

########### macOS Big Sur or Monterey 需要多做以下步骤 ###########
sudo yabai --load-sa
sudo visudo -f /private/etc/sudoers.d/yabai
# 然后输入以下内容 其中 <user> 修改为当前 mac 的用户名
# yuesir ALL = (root) NOPASSWD: /usr/local/bin/yabai --load-sa
<user> ALL = (root) NOPASSWD: /usr/local/bin/yabai --load-sa
# 之后在 yabairc 中添加以下命令即可 上面的配置文件中已经添加
sudo yabai --load-sa
yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa"

yabai 可配合 skhd 使用,Secure Keyboard Entry 这个选项必须禁用(默认关闭)。

系统第一次启动 yabai 与 skhd 之后,macOS 会提示是否允许访问辅助功能。在系统偏好设置->安装性与隐私->隐私中添加权限后,再执行下面的命令即可。

授权辅助功能

# 重启服务
brew services restart yabai
brew services restart skhd

这时候还是不能正常使用的,还需要自行配置相关文件。

配置

# 创建yabai配置文件
touch ~/.yabairc
chmod +x ~/.yabairc
# 创建skhd配置文件
touch ~/.skhdrc
chmod +x ~/.skhdrc

.yabairc配置文件示例

#!/usr/bin/env sh

# 这里参考了 yabai 的 wiki 。具体步骤下面讲
sudo yabai --load-sa
yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa"

# 窗口布局 bsp: 平铺 float: 浮动
yabai -m config layout                       bsp
# 默认拆分规则 first_child second_child
yabai -m config window_placement             second_child
# 窗口间距设置
yabai -m config top_padding                  5
yabai -m config bottom_padding               5
yabai -m config left_padding                 5
yabai -m config right_padding                5
yabai -m config window_gap                   4
# 自动平衡所有窗口始终占据相同的空间
yabai -m config auto_balance                 off
# 如果禁用自动平衡,此项属性定义的是新窗口占用的空间量。0.5意为旧窗口占用50%
yabai -m config split_ratio                 0.50
# 鼠标修饰键 意思就是按着这个键就可以使用鼠标单独修改窗口大小了
yabai -m config mouse_modifier               fn
# fn + 左键 移动
yabai -m config mouse_action1                move
# fn + 右键 
yabai -m config mouse_action2                resize
# 焦点跟随鼠标 默认off: 关闭  autoraise:自动提升 autofocus: 自动对焦
yabai -m config focus_follows_mouse          autofocus
# 设置鼠标是否跟随当前活动窗口 默认 off: 关闭 on: 开启
yabai -m config mouse_follows_focus          on

# 浮动窗口问题在顶部
yabai -m config window_topmost               on
# 修改窗口阴影 on: 打开 off: 关闭 float: 只显示浮动窗口的阴影
yabai -m config window_shadow                float

# 窗口透明度设置
yabai -m config window_opacity               on
# 配置活动窗口不透明度
yabai -m config active_window_opacity        1.0             
yabai -m config normal_window_opacity        0.9
yabai -m config window_opacity_duration      0.0

# 在主显示器上的每个空间顶部添加 20 填充 底部添加 0 填充
# yabai -m config external_bar main:20:0
# 在所有显示器上的每个空间顶部添加 0 填充 底部添加 0 填充
yabai -m config external_bar all:0:5

# ================================ 规则 ================================
# 打开系统偏好设置,不使用平铺模式
yabai -m rule --add app="^系统偏好设置$" manage=off
yabai -m rule --add app="^提醒事项$" manage=off
yabai -m rule --add app="^关于本机$" manage=off

echo "yabai configuration loaded.."

.skhdrc 文件同理:

# ================================ 窗口设置 ================================
# focus window : 激活窗口快捷键  h: 左  j: 下  k: 右 l: 上 
alt - h : yabai -m window --focus west
alt - j : yabai -m window --focus south
alt - k : yabai -m window --focus north
alt - l : yabai -m window --focus east 
# 交换窗口位置
shift + alt - h : yabai -m window --swap west
shift + alt - j : yabai -m window --swap south
shift + alt - k : yabai -m window --swap north
shift + alt - l : yabai -m window --swap east
# 移动窗口位置
shift + cmd - h : yabai -m window --warp west
shift + cmd - j : yabai -m window --warp south
# 因与IDEA shift + cmd + K push code 冲突,故注释了此快捷键
# shift + cmd - k : yabai -m window --warp north
shift + cmd - l : yabai -m window --warp east
# 浮动窗口设置 参考了Magent默认设置。因为之前用习惯了。。。。
# 恢复原始窗口大小
ctrl + alt - 0 : yabai -m space --balance
# 把浮动窗口左右平分整个屏幕  rows:cols:start-x:star-y:width:height  m行:n列:x:y:w:h
# 最大化
ctrl + alt - return : yabai -m window --grid 1:1:0:0:1:1
# 2分屏上
ctrl + alt - up     : yabai -m window --grid 2:1:0:0:2:1
# 2分屏左
ctrl + alt - left   : yabai -m window --grid 1:2:0:0:1:1
# 2分屏右
ctrl + alt - right  : yabai -m window --grid 1:2:1:1:1:1
# 2分屏下
ctrl + alt - down   : yabai -m window --grid 2:1:0:1:2:1
# 4分屏左上
ctrl + alt - u : yabai -m window --grid 2:2:0:0:1:1
# 4分屏右上
ctrl + alt - i : yabai -m window --grid 2:2:0:1:1:1
# 4分屏左下
ctrl + alt - j : yabai -m window --grid 2:2:1:0:1:1
# 4分屏右下
ctrl + alt - k : yabai -m window --grid 2:2:1:1:1:1
# 3分屏左1
ctrl + alt - d : yabai -m window --grid 1:3:0:0:1:1
# 3分屏左2
ctrl + alt - e : yabai -m window --grid 1:3:0:0:2:1
# 3分屏中1
ctrl + alt - f : yabai -m window --grid 1:3:1:0:1:1
# 3分屏右2
ctrl + alt - t : yabai -m window --grid 1:3:1:0:2:1
# 3分屏右1
ctrl + alt - g : yabai -m window --grid 1:3:3:0:1:1
# 9分屏居中
ctrl + alt - c : yabai -m window --grid 3:3:1:1:1:1

# 浮动/不浮动窗口 float / unfloat window and center on screen
alt - t : yabai -m window --toggle float;yabai -m window --grid 4:4:1:1:2:2

alt - r         : yabai -m space --rotate 90

# 调整窗口大小
ctrl + alt + cmd - left : yabai -m window --resize left:-50:0; yabai -m window --resize right:-50:0
ctrl + alt + cmd - down : yabai -m window --resize bottom:0:50; yabai -m window --resize top:0:50
ctrl + alt + cmd - up : yabai -m window --resize top:0:-50; yabai -m window --resize bottom:0:-50
ctrl + alt + cmd - right : yabai -m window --resize right:50:0; yabai -m window --resize left:50:0

# 重启 Yabai
cmd + alt - r : /usr/bin/env osascript <<< "display notification \"正在重启 Yabai\" with title \"Yabai\""; launchctl kickstart -k "gui/${UID}/homebrew.mxcl.yabai"

# ================================ 多桌面配置  ================================
# 创建一个新桌面,并把当前活动的窗口发送到新桌面,并且自动跳转到新桌面 需要jq支持 brew install jq
shift + cmd - n : yabai -m space --create && index="$(yabai -m query --spaces --display | jq '.| length')" && yabai -m window --space "${index}" && yabai -m space --focus "${index}"

# 切换回最近的一个桌面
alt - x : yabai -m space --focus recent
# 切换回第一个桌面
alt - 1 : yabai -m space --focus 1
alt - 2 : yabai -m space --focus 2
alt - 3 : yabai -m space --focus 3
alt - 4 : yabai -m space --focus 4
alt - 5 : yabai -m space --focus 5
alt - 6 : yabai -m space --focus 6
alt - 7 : yabai -m space --focus 7
alt - 8 : yabai -m space --focus 8
alt - 9 : yabai -m space --focus 9
# 关闭当前桌面
cmd + alt - w : yabai -m space --destroy

# 把窗口发送到桌面,并跟随过去 send window to desktop and follow focus
shift + cmd - z : yabai -m window --space next; yabai -m space --focus next
shift + cmd - 1 : yabai -m window --space  1; yabai -m space --focus 1
shift + cmd - 2 : yabai -m window --space  2; yabai -m space --focus 2
shift + cmd - 3 : yabai -m window --space  3; yabai -m space --focus 3
shift + cmd - 4 : yabai -m window --space  4; yabai -m space --focus 4
shift + cmd - 5 : yabai -m window --space  5; yabai -m space --focus 5
shift + cmd - 6 : yabai -m window --space  6; yabai -m space --focus 6
shift + cmd - 7 : yabai -m window --space  7; yabai -m space --focus 7
shift + cmd - 8 : yabai -m window --space  8; yabai -m space --focus 8
shift + cmd - 9 : yabai -m window --space  9; yabai -m space --focus 9

# ================================ APPS ================================
# iTerm2
cmd - return : open -a iTerm

# ================================ 多显示器配置 ================================
# focus monitora : 
# ctrl + alt - z  : yabai -m display --focus prev
# ctrl + alt - 3  : yabai -m display --focus 3

# send window to monitor and follow focus
# ctrl + cmd - c  : yabai -m window --display next; yabai -m display --focus next
# ctrl + cmd - 1  : yabai -m window --display 1; yabai -m display --focus 1

# move floating window
# shift + ctrl - a : yabai -m window --move rel:-20:0
# shift + ctrl - s : yabai -m window --move rel:0:20

# increase window size
# shift + alt - a : yabai -m window --resize left:-20:0
# shift + alt - w : yabai -m window --resize top:0:-20

# decrease window size
# shift + cmd - s : yabai -m window --resize bottom:0:-20
# shift + cmd - w : yabai -m window --resize top:0:20

# set insertion point in focused container
# ctrl + alt - h : yabai -m window --insert west

# toggle window zoom
# alt - d : yabai -m window --toggle zoom-parent
# alt - f : yabai -m window --toggle zoom-fullscreen

# toggle window split type
# alt - e : yabai -m window --toggle split

# 浮动/不浮动窗口 float / unfloat window and center on screen
#alt - t : yabai -m window --toggle float;yabai -m window --grid 4:4:1:1:2:2

# toggle sticky(+float), topmost, picture-in-picture
# alt - p : yabai -m window --toggle sticky;\
#           yabai -m window --toggle topmost;\
#           yabai -m window --toggle pip

使用

使用几天后发现,skhd的快捷键经常与应用或者系统快捷键冲突,有点麻烦。

再者就是快捷键比较多,要多加使用才能记熟,我再使用一段时间看看情况先。

效果的话差不多就下面这样:

效果图

看着还行,就是还没玩转,效率没怎么提升,遗憾。

感谢

yabai 开源项目

skhd 开源项目

Toretto