💻

macOS window management with yabai and skhd

2022/12/08に公開

概要

この記事では, 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

開発者が提供しているドキュメントはこちら.
https://github.com/koekeishiya/yabai/wiki/Installing-yabai-(latest-release)

skhdのインストール

次にskhdをインストールします.

brew install koekeishiya/formulae/skhd
brew services start skhd

開発者提供のドキュメントはこちら
https://github.com/koekeishiya/skhd

設定ファイル

ファイル構造

私の場合はホームディレクトリに以下のように設定ファイルを置いています.
yabairc, skhdrcそれぞれに設定内容を書いていきます.
どちらもgithubにベーシックなテンプレートもありますので適宜参考にしてください.

.config
├── skhd
│   └── skhdrc
└── yabai
    └── yabairc

yabairc

yabaiでは大きく二つのモードがあります.

  1. bsp : ウィンドウ分割をあらかじめ決めておき,そこにウィンドウを割り当てていくスタイル
  2. 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