displayplacerを使って、キーボードショートカットで外部ディスプレイの表示を回転させる【Mac, Big Sur】

最近、研究室の自分のデスクのディスプレイに[モニターアーム](https://www.amazon.co.jp/dp/B085NMPBPC/ref=cm_sw_em_r_mt_dp_XZB216MPE616VZK16592?_encoding=UTF8&psc=1)をつけた。安いのにかなりしっかりしている。快適研究ライフの始まりである。解析や発表スライドを作成したり、Zoomでミーティングするときはディスプレイは横向きで使い、論文を読み書きするときはくるっと回して縦型で使う。素晴らしい。

しかし、1つ不便なところがある。表示を回転させる変更が少しめんどくさいのである。環境設定を開き、ディスプレイタブで外部ディスプレイの表示を回転させる。たまに確認も入り、自動的に元に配置に戻ってしまうこともある。
![ 2021-10-27 17.59.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63532/a4b16d2e-2c88-7eef-805d-b1745fe3eca8.png)

そこで、`displayplacer`というコマンドラインツールをAutomator上で実行し、キーボードショートカットで呼び出せばいいのだが、まとめてある記事があまり見当たらなかったのでメモ。もしかしたら、そこまで需要がない、もしくはもっといい方法があるのかもしれない。

`fb-rotate`というものもあるが、ディスプレイのメインが変更されると怖いので、`displayplacer`にした。


#縦型表示のすゝめ
[ダミーテキスト](https://www.lipsum.com/)で比較した。縦型表示の方が一度にたくさんの文を読めるので、論文が読みやすい。

|横型表示|縦型表示|
|---|---|
|![Screenshot 2021-10-27 at 16-51-17 Lorem Ipsum - All the facts - Lipsum generator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63532/6a43bff4-9dbb-ebf6-fc1e-c3ce467711f1.png)|![Screenshot 2021-10-27 at 16-51-46 Lorem Ipsum - All the facts - Lipsum generator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63532/c3229314-9d82-646f-b3c3-1cbca7528b3d.png)|


#displayplacerのインストール
[displayplacer](https://github.com/jakehilborn/displayplacer)はmacOSで複数ディスプレイの配置や情報をいじるコマンドラインツールです。[Homebrew](https://brew.sh/index_ja)を用いてインストールします。ターミナル上で次のコマンドを実行します。

```
$ brew tap jakehilborn/jakehilborn && brew install displayplacer
```

- Big Surにしてから放置していたせいで、brew upgrade/updateしてもCommand Line Toolのエラーでインストールで少し詰まった。[これ](https://techracho.bpsinc.jp/wingdoor/2021_04_09/104821)を見れば理解できる。


#ディスプレイの配置情報を取得する
`displayplacer`がインストールできたら、ターミナル上で次のコマンドを実行する。

```
$ displayplacer list
```

すると、次のようにたくさん出力される。

```
     :
     :
     :
  mode 68: res:2560x1600 hz:50 color_depth:4
  mode 69: res:2560x1600 hz:50 color_depth:8

Execute the command below to set your screens to the current arrangement:

displayplacer "id:EA8876A9-951C-B458-A168-05BC015C42A8 res:1440x900 color_depth:4 scaling:off origin:(0,0) degree:0" "id:B8CE0AF7-C3CC-8AA5-03CD-20CF70F8FF2B res:1920x1080 hz:60 color_depth:4 scaling:off origin:(-1920,-1080) degree:0"
```
この最後の行に表示されるコマンドをターミナルで叩けば、今のディスプレイ配置に変更される。自分で環境設定をいじって、初期配置と回転させた時のコマンドを用意してください。

#Automatorでクイックアクションを作成する
Automatorを開いて、クイックアクションを選択する。
![ 2021-10-27 19.04.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63532/9c47bd20-460d-b4b5-dd53-dc0024bbc35f.png)

`シェルスクリプトを実行`アクションを持ってきて、先ほど用意したコマンドを貼り付ける。ワークフローが受け取る項目は`入力なし`にする。
![ 2021-10-27 19.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63532/b2a87dc1-3c38-aa53-91ce-321f3a7b6aeb.png)

```
/usr/local/bin/displayplacer "id:EA8876A9-951C-B458-A168-05BC015C42A8 res:1440x900 color_depth:4 scaling:off origin:(0,0) degree:0" "id:B8CE0AF7-C3CC-8AA5-03CD-20CF70F8FF2B res:1080x1920 hz:60 color_depth:4 scaling:off origin:(-1080,-1257) degree:270"
afplay "/System/Library/Sounds/Ping.aiff"
```

アクションの実行環境はターミナルの環境依存を継承しないので、`displayplacer`コマンドをそのまま使うことができない。なので、`displayplacer "id: ..."`の前に、`/usr/local/bin/`をつけておく。`afplay ~`は実行が終わったのを確認するために、入れた。なくてもいいが、あるとわかりやすい。音はいろんな場所に散らばってるので、好みのものを探してください([参考](https://oshiete.goo.ne.jp/qa/8778635.html))。


#ショートカットに割り当てる
クイックアクションを保存したら、環境設定を開き、キーボード -> ショートカット -> サービスと開いていき、一般タブに先ほど作成したアクションがあるので、他と被らないキーを割り当てる(被ってたら実行しないので注意)。
![ 2021-10-27 19.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63532/04e634fb-cd27-6673-3239-34f9de952c9c.png)

これで、ディスプレイの配置回転を所望の位置に変更するショートカットができました。

#今後の展望
今回のレベルで十分だったので最低限で実装しましたが、もっと一般的に対応させたいですね。回転させる前にディスプレイの情報を取得して動的にコマンドを変化させれば、自宅と研究室など複数の場所で作業する時に便利そう。現在のディスプレイの情報をどこかに保存しておけば、ショートカットキーも1つで済みそうです。
Swift, Flutterをたまに触るので、メニューバーアプリを作って、そこからGUIで操作したり。。。

まあ、こんな記事を書く暇があるなら、論文を読もう。