窗口平鋪管理軟件,可以讓多個窗口安裝自己的配置在桌面平鋪展開,且隨着單個窗口大小的改變而自適應調整、保證桌面上窗口的平鋪效果。
類似的軟件還有 Amethyst ,不過相比於 Amethyst,yabai 的上手難度會更高一些,也會更加靈活和可定制化。
希望使用 yabai,總的來說有以下步驟:
- (可選)禁用 Mac 的 SIP
System Integrity Protection
,這會解鎖 yabai 更多的功能 - 按照 yabai 並運行
- 配置自己的 yabai
- (可選)用例如 skhd 的軟件控制 yabai 的快捷鍵;或用例如 Übersicht 的軟件高亮正在使用的窗口
安裝方法
安裝並啟動 yabai
首先通過 Homebrew 安裝 yabai
brew install koekeishiya/formulae/yabai
在安裝時,Homebrew 會有如下提示:
To start koekeishiya/formulae/yabai now and restart at login:
brew services start koekeishiya/formulae/yabai
Or, if you don't want/need a background service you can just run:
yabai
這里告訴我們兩種啟動 yabai 的方式,一種是讓其一直在后台運行,一種是臨時啟動。
如果我們已經禁用了 Mac 的 SIP System Integrity Protection
,則可以在啟動前先輸入以下命令,可以啟用更多 yabai 的功能;但也會讓系統變得相對不安全:
# install the scripting addition
sudo yabai --install-sa
# if macOS Big Sur or Monterey, load the scripting addition manually; follow instructions below to automate on startup
sudo yabai --load-sa
這里我沒有選擇關閉 SIP,沒有啟用上面的功能。
我們希望 yabai 能總是在后台運行,因此我們輸入 brew services start koekeishiya/formulae/yabai
。之后會提示 yabai 需要對應的權限,允許即可。
啟動后你會發現沒有任何不同,這是因為 yabai 需要我們有對應的 .yabairc
配置文件才會生效,默認是沒有這個文件的,也就是 yabai 不會做任何處理。我們會在后面的「配置」部分講到相關的內容。
卸載 yabai
如果希望卸載 yabai,則輸入以下命令:
# stop yabai
brew services stop yabai
# uninstall the scripting addition
sudo yabai --uninstall-sa # 如果之前有啟用才需要
# uninstall yabai
brew uninstall yabai
# these are logfiles that may be created when running yabai using brew services.
# path may differ if a custom brew prefix has been selected.
rm -rf /usr/local/var/log/yabai
# remove config and various temporary files
rm ~/.yabairc
rm /tmp/yabai_$USER.lock
rm /tmp/yabai_$USER.socket
rm /tmp/yabai-sa_$USER.socket
# unload the scripting addition by forcing a restart of Dock.app
killall Dock
配置 yabai
前面提到 yabai 剛啟動時是沒有任何不同的,這是因為我們沒有對應的配置文件 .yabairc
,我們需要在 HOME 目錄下生成 .yabairc
並增加可執行權限,然后通過 brew services restart yabai
重新啟動 yabai 即可讓配置文件生效。
yabai 配置比較簡單,可以用 man yabai
和 項目中附帶的 example 對照着看,可以先拷貝成自己的 ~/.yabairc
感受一下。文章末尾我也會貼上自己當前使用的配置。
配置 skhd
yabai 配置完成啟動后便自動生效,往往我們希望通過快捷鍵來控制對應需要的行為。
例如,如果沒有快捷鍵,yabai 中將窗口全屏,需要輸入下面的終端指令:
yabai -m window --toggle zoom-fullscreen
通過如 skhd
這類軟件,我們通過如下配置,就可以將 ctrl + alt - enter
和對應指令綁定了:
ctrl + alt - enter : yabai -m window --toggle zoom-fullscreen
首先安裝 jq
和 koekeishiya/formulae/skhd
brew install jq
brew install koekeishiya/formulae/skhd
jq
是一個 json 的 cli 工具,用於在終端對 json 進行處理。通過它我們可以方便地進行一些 yabai 的相關配置,例如當前我使用的「快速關閉當前窗口」:
## Close active application (快速關閉窗口)
ctrl + alt - backspace : $(yabai -m window $(yabai -m query --windows --window | jq -re ".id") --close)
當然,我們也可以用其他的鍵盤映射工具來配置快捷鍵,例如 Karabiner;不過個人感覺他們對於命令行的配置沒有 skhd 那樣簡潔直觀。
同樣的,和 yabai 一樣,skhd 需要有 ~/.skhd
才生效,也可以看看 yabai 項目中附帶的 example 學習一下。
需要額外說一下的是,運行 skhd 時會要求 Accessibility
權限,這里我們需要注意,終端軟件也是需要一起開啟對應權限的,否則不生效:
另外再分享兩個 skhd 初配置時可能有用的東西:
- 如果
.skhdrc
有部分配置存在無法運行,那么整個.skhdrc
都不會生效- 我們可以先手動停止 skhd(
brew services stop skhd
),然后在終端運行skhd -V
或者skhd --verbose
,這會加載.skhdrc
並輸出對應 debug 信息。 - 如果有不正確或者無法運行的,skhd 便會輸出並提示(如下圖)
- 我們可以先手動停止 skhd(
- skhd 配置時,有些鍵位我們不知道如何表示
- 可以在終端運行
skhd --observe
查看鍵盤上對應按鍵在 skhd 中對應的編碼,例如下面用0x24
表示回車
- 可以在終端運行
## full screen / un-full screen(切換窗口全屏) 0x24 表示回車
ctrl + alt - 0x24 : yabai -m window --toggle zoom-fullscreen
.yabairc 和 .skhdrc
當前還沒整到 GitHub 上,最后就在文章末尾貼一下我自己當前使用的 .yabairc
和 .skhdrc
,僅供各位參考。
.yabairc
#!/usr/bin/env sh
# 如果沒有關閉 Mac 的 SIP,那么在 BigSur 及以上的系統中,更改配置文件后,需要手動加載過配置文件
# - https://github.com/koekeishiya/yabai/wiki/Installing-yabai-(latest-release)
# 如果已經關閉 Mac 的 SIP,那么通過下面命令就可以讓 yabai 的配置文件熱更新了
# sudo yabai --load-sa
# 也可以在該配置文件中增加這句,這樣每次重啟系統時不用自己輸入
# yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa"
# ------------------------------------------------------------------------------------- #
# ------------------------------global settings---------------------------------------- #
# ------------------------------------------------------------------------------------- #
# 在多顯示器情況下,新建的窗口默認在**哪個顯示器**出現
# - default: 在創建窗口的顯示器出現(mac 的默認行為)
# - focused: 在當前聚焦的顯示器出現
# - cursor: 在鼠標指針所在的顯示器出現
yabai -m config window_origin_display default
# 當前屏幕下,新窗口的出現在**屏幕的哪個位置**
# - first_child: (父節點模式)如果當前是 vertical split,則出現在*左側*;如果是 horizontal split,則出現在*上方*
# - second_child: (子節點模式)如果當前是 vertical split,則出現在*右側*;如果是 horizontal split,則出現在*下方*
yabai -m config window_placement second_child
# 浮動窗口是否置頂
yabai -m config window_topmost on
# 窗口陰影值
# - on: 總是展示
# - off: 總是關閉
# - float: 只有浮動窗口展示
yabai -m config window_shadow on
# 窗口不透明
# - on: 總是展示
# - off: 總是關閉
yabai -m config window_opacity off
# *激活*窗口的不透明度(僅當 window_opacity on 時才有效)
yabai -m config active_window_opacity 1.0
# *普通*窗口不透明度(僅當 window_opacity on 時才有效)
yabai -m config normal_window_opacity 0.90
# 激活窗口和普通窗口切換時,*不透明度的過渡時間*(僅當 window_opacity on 時才有效)
yabai -m config window_opacity_duration 0.0
# 窗口邊框
# - on: 總是展示
# - off: 總是關閉
yabai -m config window_border off
# 窗口*邊框寬度*(單位 px)
yabai -m config window_border_width 6
# 激活窗口的邊框顏色
yabai -m config active_window_border_color 0xff775759
# 普通窗口的邊框顏色
yabai -m config normal_window_border_color 0xff555555
yabai -m config insert_feedback_color 0xffd75f5f
# 所有窗口都使用相同比例的空間
# - on: 總是開啟
# - off: 總是關閉
yabai -m config auto_balance off
# 分屏后*舊:新*窗口的比例(僅當 auto_balance off 時有效)
yabai -m config split_ratio 0.50
# ==================================================== #
# ====================鼠標相關======================== #
# ==================================================== #
# 窗口切換時,鼠標自動移動到當前使用窗口的中心
# - on: 總是開啟
# - off: 總是關閉
yabai -m config mouse_follows_focus off
# 是否自動聚焦到鼠標所在窗口
# - off: 總是關閉
# - autoraise:
# - autofocus:
yabai -m config focus_follows_mouse off
# 按住對應修飾鍵時,yabai 不自動調整平鋪(默認情況下調整窗口大小時,yabai 會自適應調整平鋪);配置時通常會關閉 focus_follows_mouse
# - cmd
# - alt
# - shift
# - ctrl
# - fn
yabai -m config mouse_modifier fn
# modifier + 左鍵的行為
# - move
# - resize
yabai -m config mouse_action1 move
# modifier + 右鍵的行為
# - move
# - resize
yabai -m config mouse_action2 resize
# 在平鋪管理情況下,拖動一個窗口到另一窗口位置時的操作
# - swap: 交換窗口位置
# - stack: 堆疊在舊窗口上
yabai -m config mouse_drop_action swap
# ------------------------------------------------------------------------------------- #
# ---------------------------general space settings------------------------------------ #
# ------------------------------------------------------------------------------------- #
# yabai 布局模式
# - bsp: 平鋪
# - stack: 堆疊
# - float: 浮動
yabai -m config layout bsp
# 窗口和屏幕邊緣的距離(優先級低於 gap)
yabai -m config top_padding 08
yabai -m config bottom_padding 08
yabai -m config left_padding 08
yabai -m config right_padding 08
# 窗口與窗口之間的間距(優先級高於 padding)
yabai -m config window_gap 05
# ------------------------------------------------------------------------------------- #
# ---------------------------------specific apps--------------------------------------- #
# ------------------------------------------------------------------------------------- #
# manage: 是否使用 yabai 管理
# - on
# - off
# sticky: 是否總是置頂
# - on
# - off
# layer:
# - below
# - normal
# - above
yabai -m rule --add app="^System Preferences$" manage=off
yabai -m rule --add app="^System Information$" sticky=on layer=above manage=off
yabai -m rule --add app="^Activity Monitor$" sticky=on layer=above manage=off
yabai -m rule --add app="^Finder$" sticky=on layer=above manage=off
yabai -m rule --add app="^Alfred Preferences$" sticky=on layer=above manage=off
yabai -m rule --add app="^飛書$" sticky=on layer=above manage=off
yabai -m rule --add app="^Feishu$" sticky=on layer=above manage=off
yabai -m rule --add app="^Lark$" sticky=on layer=above manage=off
yabai -m rule --add app="^Lark Meetings$" sticky=on layer=above manage=off
yabai -m rule --add app="^Seal$" sticky=on layer=above manage=off
yabai -m rule --add app="^AppCleaner$" sticky=off layer=above manage=off
yabai -m rule --add app="^Karabiner-Elements$" sticky=on layer=above manage=off
yabai -m rule --add app="^Karabiner-EventViewer$" sticky=on layer=above manage=off
yabai -m rule --add app="^Things$" manage=off
yabai -m rule --add app="^Spotify$" manage=off
yabai -m rule --add app="^Bartender 4$" manage=off
yabai -m rule --add app="^BetterTouchTool$" manage=off
yabai -m rule --add app="^Magnet$" manage=off
yabai -m rule --add app="^WeChat$" manage=off
yabai -m rule --add app="^微信$" manage=off
echo "yabai configuration loaded.."
.skhdrc
,一些腳本就沒貼上了,感興趣的可以評論留言或者 GitHub 上翻翻看其他人的配置:
#SKHD STUFF
# if you're having troubles finding key codes for a key just type skhd --observe in a terminal and type a key. Pretty cool! Or just check the wiki.
## HYPER == SHIFT + CMD + ALT + OPTION
### ============================================================================ ###
### My Settings ###
### ============================================================================ ###
## Close active application (快速關閉窗口)
ctrl + alt - backspace : $(yabai -m window $(yabai -m query --windows --window | jq -re ".id") --close)
## Equalize size of windows (平鋪當前界面所有窗口)
ctrl + alt - 0 : yabai -m space --balance
## focus window (切換窗口焦點)
ctrl + alt - k : sh ~/.config/dotfiles/yabai/script/focus_window.sh up
ctrl + alt - j : sh ~/.config/dotfiles/yabai/script/focus_window.sh down
ctrl + alt - h : sh ~/.config/dotfiles/yabai/script/focus_window.sh left
ctrl + alt - l : sh ~/.config/dotfiles/yabai/script/focus_window.sh right
## swap window & move window in floating mode (移動窗口)
shift + alt - k : yabai -m window --swap north
shift + alt - j : yabai -m window --swap south
shift + alt - h : yabai -m window --swap west
shift + alt - l : yabai -m window --swap east
## Rotate windows clockwise and anticlockwise (旋轉窗口)
ctrl + alt - e : yabai -m space --rotate 90
ctrl + alt - r : yabai -m space --rotate 270
## float / Unfloat window (切換窗口浮動)
ctrl + alt - space : yabai -m window --toggle float ; yabai -m window --grid 12:12:1:1:9:9
## full screen / un-full screen(切換窗口全屏) 0x24 表示回車
ctrl + alt - 0x24 : yabai -m window --toggle zoom-fullscreen
## window resize
ctrl + shift + alt - k : yabai -m window --resize top:0:-20 || yabai -m window --resize bottom:0:-20
ctrl + shift + alt - j : yabai -m window --resize top:0:20 || yabai -m window --resize bottom:0:20
ctrl + shift + alt - h : yabai -m window --resize left:-20:0 || yabai -m window --resize right:-20:0
ctrl + shift + alt - l : yabai -m window --resize right:20:0 || yabai -m window --resize left:20:0
## send window to next monitor and follow focus (將窗口發送到另一個顯示器)
ctrl + alt - left : sh ~/.config/dotfiles/yabai/script/move_window_to_left.sh display
ctrl + alt - right : sh ~/.config/dotfiles/yabai/script/move_window_to_right.sh display
## create desktop, move window and follow focus - uses jq for parsing json (brew install jq)
shift + alt - n : yabai -m space --create && \
index="$(yabai -m query --spaces --display | jq 'map(select(."native-fullscreen" == 0))[-1].index')" && \
yabai -m space --focus "${index}"