macOSのタイル型ウィンドウマネジャーyabaiを、なるべくi3-wmに近くなるよう設定

## DR;TL

macOSにタイル型ウィンドウマネジャー（もどき）のyabaiを入れました。タイル型初心者なので、へんな癖をつけないほうがいいかなとおもい、i3-wmのデフォルトキーバインドになるべく近づけるように設定しました。

## 設定の概要

[i3 User’s Guide](https://i3wm.org/docs/userguide.html#_swapping_containers)と、[デフォルトconfig（i3/config.keycodes）](https://github.com/i3/i3/blob/next/etc/config.keycodes)を参考にし、なるべく近い感じに設定するように意図しました。


|                              | i3-wm                | yabai               |
| ---------------------------- | -------------------- | ------------------- |
| フォーカスの移動             | $mod + jkl;          | alt + hjkl          |
| ウィンドウをワープ           | $mod + shift + jkl;  | shift + alt + hjkl  |
| スペースにワープ             | $mod + shift + num   | shift + alt + 12345 |
| スペースにワープ (prev/next) | --                   | shift + alt + 9/0   |
| スペースに切り替え             | $mod + num           | ~~alt + 12345~~     |
| フルスクリーン (native)      | $mod + f             | shift + alt + f     |
| フルスクリーン (zoom)        | たぶん存在しない     | alt + f             |
| toggle floting               | $mod + shift + space | shift + alt + space |
| splith/splitv (toggle)       | $mod + e             | alt + e             |
| splith, splitv               | $mod + h v           | たぶん存在しない    |
| rotate 90                    | --                   | alt + r             |
| mirror x or y                | --                   | alt + x y           |

:::note info
スペースに切り替える機能は、[SIPをdisableしないといけないようなので](https://github.com/koekeishiya/yabai/wiki/Disabling-System-Integrity-Protection)、ここではやめておきました。まあ、三本指スワイプで事足りるかなと。
:::

:::note info
フルスクリーンには、画面いっぱいにする（macOSだとタイトルバーダブルクリック）と、フルスクリーンにする（macOSだと緑のボタンを押す）があります。通常使いたいのは画面いっぱいのほうなので、そちらを`alt + f`に割り当てました。
:::

## 詳細

設定ファイルは下記のとおりです。

```shell:yabairc
#!/usr/bin/env sh

# global settings
yabai -m config mouse_follows_focus          on
yabai -m config focus_follows_mouse          autoraise
yabai -m config focus_follows_mouse          on
yabai -m config window_placement             second_child
yabai -m config window_topmost               on
yabai -m config window_shadow                on
yabai -m config window_opacity               on
yabai -m config window_opacity_duration      0.0
yabai -m config active_window_opacity        1.0
yabai -m config normal_window_opacity        0.95
yabai -m config window_border                on
yabai -m config window_border_width          4
yabai -m config window_border_radius         12
yabai -m config window_border_blur           off
yabai -m config window_border_hidipi         on
yabai -m config active_window_border_color   0xff775759
yabai -m config normal_window_border_color   0xff555555
yabai -m config insert_feedback_color        0xaad75f5f
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

# general space settings
yabai -m config layout                       bsp
yabai -m config top_padding                  6
yabai -m config bottom_padding               6
yabai -m config left_padding                 6
yabai -m config right_padding                6
yabai -m config window_gap                   2
# 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
# from https://github.com/JunichiSugiura/dotfiles/blob/main/packages/wm/.config/yabai/yabairc
yabai -m rule --add app="^Spark$" manage=off
yabai -m rule --add app="^Windows 11$" manage=off
yabai -m rule --add app="^System Preferences$" manage=off
yabai -m rule --add app="^Karabiner-Elements$" manage=off
yabai -m rule --add app="^Karabiner-MultitouchExtension$" manage=off

```

```shell:skhdrc
# focus window
# |                  | i3-wm       | yabai      |
# | ---------------- | ----------- | ---------- |
# | フォーカスの移動 | $mod + jkl; | alt + hjkl |

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

# move window
# |                    | i3-wm                | yabai               |
# | -------------------| -------------------- | ------------------- |
# | ウィンドウをワープ | $mod + shift + jkl;  | shift + alt + hjkl  |
# | スペースにワープ   | $mod + shift + num   | shift + alt + 12345 |
# | ↑(prev/next)      | --                   | shift + alt + 9/0   |

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

shift + alt - 1 : yabai -m window --space 1
shift + alt - 2 : yabai -m window --space 2
shift + alt - 3 : yabai -m window --space 3
shift + alt - 4 : yabai -m window --space 4
shift + alt - 5 : yabai -m window --space 5
shift + alt - 9 : yabai -m window --space prev
shift + alt - 0 : yabai -m window --space next

# fullscreen / floating
# |                         | i3-wm                | yabai               |
# | ----------------------- | -------------------- | ------------------- |
# | フルスクリーン (native) | $mod + f             | shift + alt + f     |
# | フルスクリーン (zoom)   | たぶん存在しない     | alt + f             |
# | toggle floting          | $mod + shift + space | shift + alt + space |

# toggle window native fullscreen
shift + alt - f : yabai -m window --toggle native-fullscreen
# toggle window fullscreen zoom
alt - f : yabai -m window --toggle zoom-fullscreen
# float / unfloat window and restore position
shift + alt - space : yabai -m window --toggle float && yabai -m window --grid 4:4:1:1:2:2

# toggle window split type
# |                        | i3-wm     | yabai    |
# | ---------------------- | --------- | -------- |
# | splith/splitv (toggle) | $mod + e  | alt + e  |

alt - e : yabai -m window --toggle split

# rotate window
# |                | i3-wm | yabai      |
# | -------------- | ----- | ---------- |
# | rotate 90      |       | alt + r    |
# | mirror x or y  |       | alt + x y  |

# 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

# restart yabai
# from https://github.com/koekeishiya/yabai/wiki/Tips-and-tricks
# (2022-10-11 21:24)
ctrl + alt + cmd - r : launchctl kickstart -k "gui/${UID}/homebrew.mxcl.yabai"

```

## 便利コマンド

skhdのconfigを変更したのちに、反映させるのは……

```
$ skhd -r
```

skhdのconfigが怪しいときに、チェックするには……

```
$ brew services stop skhd
$ skhd -V
```

yabaiのconfigを書き換えたとき、反映させるのは……

```
$ brew services restart yabai
```

または、上記`skhdrc`にあるように記述しておいて、`ctrl + option + command + r`。


## おわりに

yabai + skhd、すごくいいです。なにより、「ウィンドウのレイアウトを操作する」という、ムダな手数が激減しました。macOS自体や各種アプリが、タイル型ウィンドウマネジャー用につくられているわけではないので、自然に使えるようになるには、もう少しコツを発見する必要がありそうですが、そのことを差し引いても、とてもいいです。

### 参考リンク

- skhd
    - 本家：[GitHub - koekeishiya/skhd: Simple hotkey daemon for macOS](https://github.com/koekeishiya/skhd)
    - config：[yabai/skhdrc at master · koekeishiya/yabai · GitHub](https://github.com/koekeishiya/yabai/blob/master/examples/skhdrc)

- yabai
    - 本家：[GitHub - koekeishiya/yabai: A tiling window manager for macOS based on binary space partitioning](https://github.com/koekeishiya/yabai)
    - config：[yabai/yabairc at master · koekeishiya/yabai · GitHub](https://github.com/koekeishiya/yabai/blob/master/examples/yabairc)
    - wiki：[Home · koekeishiya/yabai Wiki · GitHub](https://github.com/koekeishiya/yabai/wiki)

- 解説記事
    - [Mac用タイル型ウィンドウマネージャーのyabaiがヤバイ - Qiita](https://qiita.com/psyashes/items/68ac40659ddbe04f8f7f)
    - [macOS向けタイル型ウィンドウマネージャ | Yabai + skhd - YouTube](https://www.youtube.com/watch?v=-9gJH4K3fEQ)
        - config (yabai)：[dotfiles/yabairc at main · JunichiSugiura/dotfiles · GitHub](https://github.com/JunichiSugiura/dotfiles/blob/main/packages/wm/.config/yabai/yabairc)
        - config (skhd)：[dotfiles/skhdrc at main · JunichiSugiura/dotfiles · GitHub](https://github.com/JunichiSugiura/dotfiles/blob/main/packages/keybindings/.config/skhd/skhdrc)


    - [yabai + skhdの設定周りについて - Qiita](https://qiita.com/mitubaEX328/items/4a5165482b6348f207e2)
        - config：[dotfiles/.khdrc at master · mitubaEX/dotfiles · GitHub](https://github.com/mitubaEX/dotfiles/blob/master/.khdrc)
    - [イケてるデスクトップ環境を作る(yabai + skhd + Übersicht)](https://zenn.dev/yootaki/articles/d6ba758c63a315)

### 環境

ここで書いていることは、下記のバージョンで実施しました。

- skhd version 0.3.5
- yabai-v5.0.1
- macOS Monterey 12.5.1
- MacBook Pro (14-inch, 2021)