Macの画面切り替えを yabai と skhd で爆速にしたい

# はじめに
<!-- 発端や概要を記載 -->
Macでの画面切り替え、皆さんはどうしていますか？複数タブやページを開いてるときに、画面分割を早くしたいときってありますよね。
マウスやTrackpadで操作するのも良いですが、キーボードを使えばそれを爆速にすることが可能です。今回はその設定方法を紹介したいと思います。


## 目次
<!-- タイトルとアンカー名を編集 -->
1. [yabaiがヤバイらしい?](#yabaiがヤバイらしい)
2. [yabaiとskhdのセットアップ方法](#yabaiとskhdのセットアップ方法)
3. [yabaiとskhdを有効化する](#yabaiとskhdを有効化する)
4. [補足](#補足)
5. [参考文献](#参考文献)

<!-- 各チャプター -->
<a id="#yabaiがヤバイらしい？"></a>
## yabaiがヤバイらしい？


yabai という window マネージャーがあるということで、実際に試してみることにしました。yabai は自分がやりたい画面操作などを、yabai が用意しているコマンドを用いて、設定できます。また、同じ開発者が開発している skhd という hotkey demon と組み合わせることで、よりフレキシブルにカスタマイズできるのが利点です。
両者ともに Mac に Homebrew さえ入っていれば、コマンドを叩くことで簡単にインストールできます。

- [yabai のレポジトリ](https://github.com/koekeishiya/yabai)
- [skhd のレポジトリ](https://github.com/koekeishiya/skhd)


<a id="yabaiとskhdのセットアップ方法"></a>
## yabaiとskhdのセットアップ方法
実際にセットアップする方法になります。ものの数分で終わります。
まずは下のコマンドで yabai を install します。

```
$ brew install koekeishiya/formulae/yabai
```

次に skhd を install します。

```
$ brew install koekeishiya/formulae/skhd
```

次に、yabai と skhd を動かすためのスクリプトファイルを作って、.config配下に配置していきます。


まずは ホームディレクトリの .config ファイルに移動して
```
$ cd ~/.config
```

yabai と skhd のファイルを用意してあげます。
```
$ mkdir yabai skhd 
```
その後に .config/yabai 配下(または .config/skhd ディレクトリの配下)に移動して
```
$ touch yabairc (または touch skhdrc)
```
セッティングを記述するファイルを用意します。

 ### 作成したファイルにコマンドをセッティングする

上の項目で作成した yabairc と skhdrc に自分がセットしたいコマンドを記述していきます。
こちらは開発者の dotfile にも yabairc と skhdrc の設定があったので参考になるかと思います。

[開発者のyabairc](https://github.com/koekeishiya/dotfiles/blob/master/yabai/yabairc)

[開発者のskhdrc](https://github.com/koekeishiya/dotfiles/blob/master/skhd/skhdrc)

以下は筆者が設定している項目になります。ぜひ参考にして見てください。
また、筆者はUSキーボードを使用しているので、USキーボードで操作しやすいようにカスタマイズしています。
JISキーボードの場合だと操作しにくい場合もあるので、その際は自由にカスタマイズいただければと思います。

```terminal:yabairc
# 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               off
yabai -m config window_opacity_duration      0.0
yabai -m config active_window_opacity        0.0
yabai -m config normal_window_opacity        0.0
yabai -m config window_border                off
yabai -m config window_border_width          3
yabai -m config active_window_border_color   0xFF88C0D0
yabai -m config normal_window_border_color   off
yabai -m config insert_feedback_color
yabai -m config split_ratio                  0.50
yabai -m config auto_balance                 on
yabai -m config mouse_modifier               ctrl
yabai -m config mouse_action1                move
yabai -m config mouse_action2                resize
yabai -m config window_border_blur           off
# general space settings
yabai -m config layout                       bsp
yabai -m config top_padding                  01
yabai -m config bottom_padding               01
yabai -m config left_padding                 01
yabai -m config right_padding                01
yabai -m config window_gap                   0.5



# Rules
yabai -m rule --add app="^System Settings$" manage=off
yabai -m rule --add app="^Music$" manage=off
yabai -m rule --add app="^Docker$" manage=off
yabai -m rule --add app="^iTerm2$" manage=off
```

yabai には window が float している状態(Macで window を開いたときのデフォルトの状態)の ON/OFF を切り替えられるコマンドがあるので、筆者はそれを用いて、画面調整されたくない window は切り替えたりしています。
また、Music や System Settings などは常時 float のほうが使い勝手が良かったりするので、#Rules の部分に manage を off にするように設定しています。


```terminal:skhdrc

# Launch Applications

shift + cmd - 0x01: osascript -e 'tell application "Slack" to run' \
  -e 'tell application "System Events"' \
  -e 'if visible of application process "Slack" is true then' \
  -e 'set visible of application process "Slack" to false' \
  -e 'else' \
  -e 'set visible of application process "Slack" to true' \
  -e 'end if' \
  -e 'end tell'

shift + cmd - 0x02: osascript -e 'tell application "Docker" to run' \
  -e 'tell application "System Events"' \
  -e 'if visible of application process "Slack" is true then' \
  -e 'set visible of application process "Slack" to false' \
  -e 'else' \
  -e 'set visible of application process "Slack" to true' \
  -e 'end if' \
  -e 'end tell'

# Focus Window
alt - h: yabai -m window --focus west || yabai -m display --focus west
alt - l: yabai -m window --focus east || yabai -m display --focus east
alt - k: yabai -m window --focus south || yabai -m display --focus south
alt - j: yabai -m window --focus north || yabai -m display --focus north
alt - n: yabai -m window --focus next || yabai -m display --focus next
alt - p: yabai -m window --focus prev || yabai -m display --focus prev

# Move Window between Displays

alt - left: yabai -m window --display prev \
  && yabai -m display --focus prev
alt - right: yabai -m window --display next \
  && yabai -m display --focus next

# Move Window in Same Display

alt + cmd - left: yabai -m window --swap west
alt + cmd - right: yabai -m window --swap east
alt + cmd - up: yabai -m window --swap north
alt + cmd - down: yabai -m window --swap south
ctrl + shift - left: yabai -m window --resize left:-50:0 || yabai -m window --resize right:-50:0
ctrl + shift - right: yabai -m window --resize right:50:0 || yabai -m window --resize left:50:0
ctrl + shift - down: yabai -m window --resize bottom:0:20 || yabai -m window --resize top:0:20
ctrl + shift - up: yabai -m window --resize top:0:-20 || yabai -m window --resize bottom:0:-20

# Focus Display(alt + 左右矢印でも focus を switch できるよう設定してます)

alt - 0x2B: yabai -m display --focus prev \
  && yabai -m display --focus stack.prev
alt - 0x2F: yabai -m display --focus next \
  && yabai -m display --focus stack.next

# Toggle FullScreen

alt - z: yabai -m window --toggle zoom-fullscreen

# Mirror

alt - y: yabai -m space --mirror y-axis
alt - x: yabai -m space --mirror x-axis


# Rotate & Split & Balance & Toggle

alt - r: yabai -m space --rotate 90
alt - s: yabai -m window --toggle split
alt - b: yabai -m space --balance
alt - f: yabai -m window --toggle float; \
  yabai -m window --grid 4:4:1:1:2:2

```
skhd には option + z で選択した window の全拡大、 option + command + → などで画面を入れ替えるなどのショートカットキーを設定しています。モニターを使用している場合などは、 option + ← などで window の移動ができるようにしています。

色々好みがあると思いますので、カスタマイズしてみるといいかもしれません。

<a id="#yabaiとskhdを有効化する"></a>
## yabaiとskhdを有効化する

これでファイルは作成できましたが、設定ファイルを有効化させる必要があります。
以下のコマンドを叩いて、設定を有効化させます。

```
 $ chmod +x ~/.config/yabai/yabairc 
または
 $ chmod +x ~/.config/skhd/skhdrc
```

また、下の画像のように Mac の System Settings の Privacy & Security の Accessibility の skhd と yabai にもチェックを入れて有効化する必要がありますので、お忘れなく。

![Screenshot 2023-02-11 at 15.30.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437553/ede191ea-ea53-005a-22d3-de59eee025cf.png)

これで設定は以上になります。



## 補足
筆者は上をすべてセッティングしたのですが、それでも yabaiがうまく機能しない問題にあたりました。
その際に、Mission Control の Displays has separate Spaces を ON にして再起動し直すと、うまく動いたので、動かない方は試してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437553/89232e66-da5b-999f-d105-30949f2876ba.png)


~~yabai と skhd を再起動する際は、~~
```
$ brew services restart yabai(またはskhd) 
```
~~でできます。~~

追記: 現在は以下のコマンドに変わっているようです。(2024/6/2時点)

```
$ yabai --stop-service(停止)
$ yabai --start-service(開始)
```



この記事がきっかけで、日々の作業効率が少しでもUPしたら幸いです。

少しでもお役に立ちましたら、いいね:thumbsup:お願いします！









<a id="#参考文献"></a>
### 参考文献
- [shiftlt](https://github.com/fikovnik/ShiftIt)
- [yabai](https://github.com/koekeishiya/yabai)