yabai - Mac 的窗口平鋪管理軟件


https://github.com/koekeishiya/yabai

窗口平鋪管理軟件,可以讓多個窗口安裝自己的配置在桌面平鋪展開,且隨着單個窗口大小的改變而自適應調整、保證桌面上窗口的平鋪效果。

類似的軟件還有 Amethyst ,不過相比於 Amethyst,yabai 的上手難度會更高一些,也會更加靈活和可定制化。

希望使用 yabai,總的來說有以下步驟:

  1. (可選)禁用 Mac 的 SIP System Integrity Protection,這會解鎖 yabai 更多的功能
  2. 按照 yabai 並運行
  3. 配置自己的 yabai
  4. (可選)用例如 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

首先安裝 jqkoekeishiya/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 初配置時可能有用的東西:

  1. 如果 .skhdrc 有部分配置存在無法運行,那么整個 .skhdrc 都不會生效
    1. 我們可以先手動停止 skhd(brew services stop skhd),然后在終端運行 skhd -V 或者 skhd --verbose,這會加載 .skhdrc 並輸出對應 debug 信息。
    2. 如果有不正確或者無法運行的,skhd 便會輸出並提示(如下圖)

  1. skhd 配置時,有些鍵位我們不知道如何表示
    1. 可以在終端運行 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}"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM