タイル型ウィンドウマネージャを始めた
2024-08-18
ウィンドウを開きすぎて収集がつかなくなることが多いので、ついにタイル型ウィンドウマネージャ (tiling window manager) を導入しました。
有名なものとしてはi3がありますが、タイル型ウィンドウマネージャとは、デスクトップ全体にウィンドウを敷き詰めるように表示してくれるツールです。ウィンドウの増減に応じて全てのウィンドウの位置と大きさを自動的に計算し、重ならないようにデスクトップ全体に配置してくれます。
スタック型ウィンドウマネージャや現在macOSやWindowsで採用されているコンポジット型ウィンドウマネージャと比べて、ウィンドウが行方不明になることがない、デスクトップの面積を最大限活用できる、などの利点があると思っています。
yabaiとskhd
さて、今回はmacOS用のタイル型ウィンドウマネージャyabaiと補助ツールのskhdを導入しました。他の選択肢としてAmethystがありますが、yabaiの方が検索して出てくる情報が多く、機能も充実しているようなので、yabaiにしてみました。macOS Sonoma 14.4.1 (Apple Silicon) にインストールしていきます。
インストール
yabaiの公式Wikiとshkdの READMEにしたがってインストールしていきます。
Disabling System Integrity Protection (オプション)
いくつかの機能(特にデスクトップ操作関連)を使うためにはmacOSのSIPをオフにする必要があります。こちらにしたがって設定を進めれば迷うことはないはずです。macOS 13以降ではSIPを部分的にオフにすることができ、公式Wikiにもそのコマンドが載っています。
yabaiのインストール
ツールはHomebrewでインストールできますが、System Settingsでアクセシビリティ設定をする必要があるので、こちらを参照しながら設定を進めます。
brew install koekeishiya/formulae/yabai
[System Settingsでの操作]
yabai --start-service
[System Settingsでの操作]
Configure scripting addition (オプション)
SIPをオフにした場合、このステップでスクリプトを追加することで先述した追加機能が使えるようになります。詳しい説明はこちら。
echo "$(whoami) ALL=(root) NOPASSWD: sha256:$(shasum -a 256 $(which yabai) | cut -d " " -f 1) $(which yabai) --load-sa" | sudo tee /private/etc/sudoers.d/yabai
上記コマンドを実行した上で、設定ファイルの冒頭に次の数行を追加します。
# for this to work you must configure sudo such that
# it will be able to run the command without password
yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa"
sudo yabai --load-sa
# .. more yabai startup stuff
skhdのインストール
yabaiと同様に、System Settingsを操作しながらインストールを進めます。
brew install koekeishiya/formulae/skhd
[System Settingsでの操作]
skhd --start-service
[System Settingsでの操作]
設定
以上でインストールは完了なので、設定をしていきます。設定ファイルの場所はそれぞれ~/.config/yabai/yabairc
と~/.config/skhd/skhdrc
です。
基本的には公式の設定例を参考に自分の設定を追加していますが、使い勝手がわからないのでこれから使いながら調整します。
設定を変更したら、下記コマンドでツールを再起動しましょう。
yabai --restart-service
skhd --restart-service
yabai
yabairc
#!/usr/bin/env sh
#
# for this to work you must configure sudo such that
# it will be able to run the command without password
#
# see this wiki page for information:
# - https://github.com/koekeishiya/yabai/wiki/Installing-yabai-(latest-release)#configure-scripting-addition
#
yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa"
sudo yabai --load-sa
# global settings
yabai -m config \
external_bar off:40:0 \
menubar_opacity 1.0 \
mouse_follows_focus off \
focus_follows_mouse off \
display_arrangement_order default \
window_origin_display default \
window_placement second_child \
window_zoom_persist on \
window_shadow on \
window_animation_duration 0.0 \
window_animation_easing ease_out_circ \
window_opacity_duration 0.0 \
active_window_opacity 1.0 \
normal_window_opacity 0.90 \
window_opacity off \
insert_feedback_color 0xffd75f5f \
split_ratio 0.50 \
split_type auto \
auto_balance off \
top_padding 6 \
bottom_padding 6 \
left_padding 6 \
right_padding 6 \
window_gap 06 \
layout bsp \
mouse_modifier fn \
mouse_action1 move \
mouse_action2 resize \
mouse_drop_action swap
# rules
# do not manage the following apps
yabai -m rule --add app="^System Settings$" manage=off
yabai -m rule --add app="^Spotify$" manage=off
echo "yabai configuration loaded.."
skhd
skhdrc
# focus window
alt - x : yabai -m window --focus recent
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
alt - z : yabai -m window --focus stack.prev
alt - c : yabai -m window --focus stack.next
# move window
shift + alt - h : yabai -m window --warp west
shift + alt - j : yabai -m window --warp south
shift + alt - k : yabai -m window --warp north
shift + alt - l : yabai -m window --warp east
# swap window
shift + cmd - x : yabai -m window --swap recent
shift + cmd - h : yabai -m window --swap west
shift + cmd - j : yabai -m window --swap south
shift + cmd - k : yabai -m window --swap north
shift + cmd - l : yabai -m window --swap east
# make window fill screen
# left-half
shift + cmd - left : yabai -m window --toggle float --grid 1:2:0:0:1:1
# right-half
shift + cmd - right : yabai -m window --toggle float --grid 1:2:1:0:1:1
# top-half
shift + cmd - up : yabai -m window --toggle float --grid 2:1:0:0:1:1
# bottom-half
shift + cmd - down : yabai -m window --toggle float --grid 2:1:0:1:1:1
# move floating window
shift + ctrl - h : yabai -m window --move rel:-20:0
shift + ctrl - j : yabai -m window --move rel:0:20
shift + ctrl - k : yabai -m window --move rel:0:-20
shift + ctrl - l : yabai -m window --move rel:20:0
# increase window size
shift + alt - a : yabai -m window --resize left:-20:0
shift + alt - s : yabai -m window --resize bottom:0:20
shift + alt - w : yabai -m window --resize top:0:-20
shift + alt - d : yabai -m window --resize right:20:0
# decrease window size
shift + cmd - a : yabai -m window --resize left:20:0
shift + cmd - s : yabai -m window --resize bottom:0:-20
shift + cmd - w : yabai -m window --resize top:0:20
shift + cmd - d : yabai -m window --resize right:-20:0
# rotate tree
alt - r : yabai -m space --rotate 90
# mirror tree y-axis
alt - y : yabai -m space --mirror y-axis
# mirror tree x-axis
alt - x : yabai -m space --mirror x-axis
# toggle desktop offset
alt - a : yabai -m space --toggle padding && yabai -m space --toggle gap
# toggle window fullscreen zoom
alt - f : yabai -m window --toggle zoom-fullscreen
# toggle window native fullscreen
shift + alt - f : yabai -m window --toggle native-fullscreen
# toggle window split type
alt - e : yabai -m window --toggle split
# float / unfloat window and restore position
# alt - t : yabai -m window --toggle float && /tmp/yabai-restore/$(yabai -m query --windows --window | jq -re '.id').restore 2>/dev/null || true
alt - t : yabai -m window --toggle float && yabai -m window --grid 4:4:1:1:2:2
# create desktop, move window and follow focus - uses jq for parsing json (brew install jq)
shift + cmd + alt - n : yabai -m space --create && \
index="$(yabai -m query --spaces --display | jq 'map(select(."is-native-fullscreen" == false))[-1].index')" && \
yabai -m window --space "${index}" && \
yabai -m space --focus "${index}"
# focus monitor
alt - left : yabai -m display --focus prev
alt - right : yabai -m display --focus next
# send window to monitor and follow focus
shift + alt - left : yabai -m window --display prev; yabai -m display --focus prev
shift + alt - right : yabai -m window --display next; yabai -m display --focus next
# fast focus desktop
cmd + alt - left : yabai -m space --focus prev
cmd + alt - right : yabai -m space --focus next
# send window to desktop and follow focus
shift + cmd + alt - left : yabai -m window --space prev; yabai -m space --focus prev
shift + cmd + alt - right : yabai -m window --space next; yabai -m space --focus next
まとめ
あとは使ってみるだけです。新しい道具を体に馴染ませていく過程を楽しみましょう。