kenban nikki    archives   tags   

タイル型ウィンドウマネージャを始めた

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

まとめ

あとは使ってみるだけです。新しい道具を体に馴染ませていく過程を楽しみましょう。

参考にした記事