macOS window management with yabai and skhd
概要
この記事では, yabaiとskhdを利用した自分なりのウィンドウマネージメントの設定を紹介します.
こんな方にオススメ
- Macでいい感じにwindowマネジメントしたい
yabaiとskhd
大まかに紹介するとそれぞれ
- yabai : ウィンドウマネジメントユーティリティ
- skhd : macOS向けのホットキーデーモン
であり,どちらも同じ方が開発されています.
yabai自体はコマンドラインでウィンドウに対する操作を実現してくれます.
例えば,ウィンドウの位置やサイズ,複数のディスプレイがある場合はディスプレイ間の移動などをコマンド実行で実現します.
一方skhdは単なるホットキーデーモンで,いわゆるショートカットキーをカスタマイズすることができます.
yabai + skhdを使ったウィンドウマネジメント環境の構築では
- yabaiでウィンドウマネジメントの際の設定管理
- skhdでyabaiの操作をホットキーに割り当て
という役割分担をさせています.
後に紹介しますが,skhdはウィンドウマネジメント以外のホットキーも設定でき,私の場合はよく使うアプリケーションの切り替えを割り当てたりしています.
環境
- MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
- 2.3 GHz クアッドコアIntel Core i7
- macOS Monterey 12.6
- Homebrewをインストール済み
準備
yabaiのインストール
Homebrewを通してyabaiとskhdをインストールします
brew install koekeishiya/formulae/yabai
# stop yabai
brew services stop yabai
# upgrade yabai
brew upgrade yabai
# start yabai
brew services start yabai
開発者が提供しているドキュメントはこちら.
skhdのインストール
次にskhdをインストールします.
brew install koekeishiya/formulae/skhd
brew services start skhd
開発者提供のドキュメントはこちら
設定ファイル
ファイル構造
私の場合はホームディレクトリに以下のように設定ファイルを置いています.
yabairc, skhdrcそれぞれに設定内容を書いていきます.
どちらもgithubにベーシックなテンプレートもありますので適宜参考にしてください.
.config
├── skhd
│ └── skhdrc
└── yabai
└── yabairc
yabairc
yabaiでは大きく二つのモードがあります.
-
bsp
: ウィンドウ分割をあらかじめ決めておき,そこにウィンドウを割り当てていくスタイル -
float
: 分割は指定せず,適宜動かすスタイル
私の場合floatは肌に合わなかったのでbspにしています.
#!/usr/bin/env shcode
# global settings
yabai -m config mouse_follows_focus off
yabai -m config focus_follows_mouse off
yabai -m config window_origin_display default
yabai -m config window_placement second_child
yabai -m config window_topmost off
yabai -m config window_shadow on
yabai -m config window_opacity off
yabai -m config window_opacity_duration 0.0
yabai -m config active_window_opacity 1.0
yabai -m config normal_window_opacity 0.90
yabai -m config window_border off
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
yabai -m config split_ratio 0.50
yabai -m config auto_balance on
yabai -m config mouse_modifier fn
yabai -m config mouse_action1 move
yabai -m config mouse_action2 resize
yabai -m config mouse_drop_action swap
# general space settings
yabai -m config layout bsp
yabai -m config top_padding 12
yabai -m config bottom_padding 12
yabai -m config left_padding 12
yabai -m config right_padding 12
yabai -m config window_gap 06
# Rules
yabai -m rule --add app="^System Preferences$" monage=off
echo "yabai configuration loaded.."
skhdrc
yabaiの設定ファイルを作成できたら,次にskhdでホットキーを割り当てていきます.
# focus window
alt - n: yabai -m window --focus next || yabai -m display --focus next
alt - b: yabai -m window --focus prev || yabai -m display --focus prev
# move managed window
shift + cmd - h: yabai -m window --warp next
shift + cmd - j: yabai -m window --warp prev
# make window fill screen
shift + ctrl + cmd - m: yabai -m window --grid 1:1:0:0:1:1
# make window fill a half of screen
shift + ctrl + cmd - left: yabai -m window --grid 1:2:0:0:1:1
shift + ctrl + cmd - right: yabai -m window --grid 1:2:1:0:1:1
shift + ctrl + cmd - up: yabai -m window --grid 2:1:1:0:1:1
shift + ctrl + cmd - down: yabai -m window --grid 2:1:0:1:1:1
# move window between displays
shift + ctrl + alt - left: yabai -m window --display next; yabai -m display --focus next; yabai -m window --focus last; yabai -m window --grid 1:1:0:0:1:1;
shift + ctrl + alt - right: yabai -m window --display prev; yabai -m display --focus prev; yabai -m window --focus last; yabai -m window --grid 1:1:0:0:1:1;
# open app
shift + ctrl + cmd - k: open /Applications/kitty.app
shift + ctrl + cmd - n: open /Applications/Notion.app
shift + ctrl + cmd - g: open /Applications/Google\ Chrome.app
shift + ctrl + cmd - v: open /Applications/Visual\ Studio\ Code.app
shift + ctrl + cmd - s: open /Applications/Slack.app
shift + ctrl + cmd - t: open /Applications/Microsoft\ Teams.app
shift + ctrl + cmd - o: open /Applications/Microsoft\ Outlook.app
shift + ctrl + cmd - f: open ~/
shift + ctrl + cmd - r: open /Applications/RStudio.app
こだわりポイント1 : ウィンドウサイズを最大化
個人的には,デスクトップをいくつも作るのは切り替えが遅くなるので避けたいと考えています.
基本的にはウィンドウサイズの最大化で対応したいと思っていて,それをctrl + shift + m
というコマンドに割り当てています.
shift + ctrl + cmd - m: yabai -m window --grid 1:1:0:0:1:1
こだわりポイント2 : ディスプレイの半分のサイズにする
yabaiでは一つの画面をいくつかのタイルにあらかじめ分割しておき,そこにウィンドウを割り当てていくこともできます.
ただ余りこの管理体系がしっくりきませんでした.基本的にはタイル分割はせず,分割するにもディスプレイを2分割できれば十分と思っているので,
- 上半分・下半分・右半分・左半分
の4パターンでウィンドウをディスプレイの半分のサイズに変更するホットキーを以下のように割り当てています.
shift + ctrl + cmd - (left|right|up|down)
としていて,矢印キーを押した方向にウィンドウサイズを半分に変更するようにしています.これは割と直感的なので気に入っています.
shift + ctrl + cmd - left: yabai -m window --grid 1:2:0:0:1:1
shift + ctrl + cmd - right: yabai -m window --grid 1:2:1:0:1:1
shift + ctrl + cmd - up: yabai -m window --grid 2:1:1:0:1:1
shift + ctrl + cmd - down: yabai -m window --grid 2:1:0:1:1:1
こだわりポイント3 : ディスプレイ間の移動
ディスプレイサイズの変更は基本的にその時表示されているディスプレイ内部で適用されます.
私は他のディスプレイにウィンドウを移動するために,別途ホットキーを割り当てています.
別のウィンドウに移動した際に合わせてウィンドウを最大化するようにもしています.
shift + ctrl + alt - left: yabai -m window --display next; yabai -m display --focus next; yabai -m window --focus last; yabai -m window --grid 1:1:0:0:1:1;
shift + ctrl + alt - right: yabai -m window --display prev; yabai -m display --focus prev; yabai -m window --focus last; yabai -m window --grid 1:1:0:0:1:1;
こだわりポイント4 : アプリ切り替え
ウィンドウマネジメントとは若干離れますが,よく使うアプリにすぐにフォーカスできるように専用のホットキーを割り当てています.
例えばVScodeに切り替えるために
shift + ctrl + cmd - v: open /Applications/Visual\ Studio\ Code.app
としていて,shift + ctrl + cmd - v
と入力すればすぐにVScodeにフォーカスすることができます.
他にも, kittyやslack, google chromeなどにも割り当てていて,macOSで提供されているアプリケーションの切り替えcmd + tab
よりも効率は良い気がしています.
終わりに
ここまでyabai + skhdを使ったmacOSのウィンドウマネジメント環境設定について紹介してきました.
同じようなことをされている方の参考になれば幸いです.
Discussion