Mac用タイル型ウィンドウマネージャーのyabaiがヤバイ

# WM(Window Manager)とは
Linuxを普段使いしている人ならおなじみのWM(Window Manger)。
キーボードだけでモニター内のアプリのウィンドウを操作できるツールです。
有名なものだと[i3](https://i3wm.org/)や[xmonad](https://xmonad.org/)があります。
この二つをは基本的にLinuxのみで動くもので、LinuxからMacに移行する人や、両方とも使う人にはMac用の代替品が欲しくなります。
その一つが[yabai](https://github.com/koekeishiya/yabai)です。


# yabaiとは
[yabai](https://github.com/koekeishiya/yabai)はi3ライクにウィンドウ操作ができるWMです。
![yabai.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/9d56d2e8-99e1-0c24-cbcf-ffc08bcd7c0a.gif)


キーボードのみでウィンドウの切り替えやサイズ・レイアウトの変更ができます。



# yabaiのセットアップ
yabaiをbrewでインストール

```shell
brew install koekeishiya/formulae/yabai
```

yabai自体は `yabai -m window --focus recent`などのコマンドでウィンドウを操作するもので、キーボードで操作するには、[skhd](https://github.com/koekeishiya/skhd)というショートカットツールが必要になります。


skhdをbrewでインストール

```shell
brew install koekeishiya/formulae/skhd
```

yabaiとskhdには、ショートカットを定義するそれぞれの設定ファイルをルートディレクトリに置く必要があります。
基本的には、yabaiの開発者の[設定ファイル](https://github.com/koekeishiya/dotfiles)を参考にして改良しました。

```txt:.yabairc
#!/usr/bin/env sh

# global settings
yabai -m config mouse_follows_focus          on
yabai -m config focus_follows_mouse          autoraise
yabai -m config window_placement             second_child
yabai -m config window_topmost               on
yabai -m config window_shadow                off
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          6
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                  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

# restore position of floating windows when they are manually unfloated
# ~/Scripts/yabai_restore.sh

echo "yabai configuration loaded.."
```

```txt:.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

# swap window
shift + alt - x : yabai -m window --swap recent
shift + alt - h : yabai -m window --swap west
shift + alt - j : yabai -m window --swap south
shift + alt - k : yabai -m window --swap north
shift + alt - l : yabai -m window --swap east

# move window
shift + cmd - h : yabai -m window --warp west
shift + cmd - j : yabai -m window --warp south
shift + cmd - k : yabai -m window --warp north
shift + cmd - l : yabai -m window --warp east

# move window
shift + ctrl - a : yabai -m window --move rel:-20:0
shift + ctrl - s : yabai -m window --move rel:0:20
shift + ctrl - w : yabai -m window --move rel:0:-20
shift + ctrl - d : 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

```



また、yabaiとskhdを有効化するには、[設定]→[セキュリティとプライバシー]→[プライバシー]→[アクセシビリティ]でコンピュータの制御の権限を有効にする必要があります。

![スクリーンショット 2020-09-26 15.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/6ecc204b-ecb7-0ced-46ed-7c6d31f41067.png)


権限を有効化できたら、serviceとして起動します。

```
brew services start skhd
brew services start yabai
```

これで既存のウィンドウが自動で綺麗なタイル型に配置され、`.skhdrc`で設定したショートカットでウィンドウを操作できます。


# デモ
上記のショートカット設定で、実際にウィンドウを操作してみます。

**ウィンドウの移動**

```
alt + hjkl(vimと同じキーバインドの上下左右)
```
![move_window2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/9c09af6b-a771-6c0a-0b86-2533eddfaf18.gif)


**ウィンドウの切り替え**

```
shift + alt + hjkl
```
![swap_window.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/8b92bd8c-546c-ae65-9f7f-bfc64b1524bd.gif)


**ウィンドウサイズを大きくする**

```
shift + alt + aswd
```
![yabai_increase.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/034afa1f-6ce6-e091-db65-061a4fe5bc68.gif)


**ウィンドウサイズを小さくする**

```
shift + command + aswd
```
![yabai_decrease.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/f544b720-a3d5-f884-8cc5-cb67867179fb.gif)


**ウィンドウを画面の中心に配置する**

```
alt + t
```
![yabai_senter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294580/dfcde6bb-f807-da73-b044-98cab41cc445.gif)





## .cf
https://github.com/koekeishiya/yabai
https://github.com/koekeishiya/dotfiles/blob/master/skhd/skhdrc