macOSで解像度変更をコマンドで実行できるdisplayplacerを対話的に利用するスクリプトを書く
先日、次の記事でmacOSの画面解像度をコマンドラインで変更できるツールを紹介したのですが、利用可能な解像度を探して手入力するのが面倒に感じたので、対話的に選んで実行できるラッパースクリプトを書きました。
実行すると利用可能な解像度一覧が表示されます。一覧はインクリメンタルサーチで候補を絞り込めます。この操作のために peco or percol を使用します。

このような機能を次の実装で実現しています。
displayplacer listを実行して display id と mode をリスト化する- リストを peco or percol で選択できるようにする
- 選択されたリストから
id:xxx mode:nnnを取得して displayplacer を実行して解像度を変える
displayplacer list のリスト表示自体がそのままパラメータとして再利用できる形式であれば、displayplacer $( displayplacer list | peco ) のように実行すれば済むのですが、惜しいことにそのまま渡せない形式だったため、こういう実装でカバーしました。
スクリプト自体は bash の書き出しで始まっていますが、主要な文字列処理は awk です。スクリプトを changeres.sh とかの名前で保存してご利用ください。
#!/bin/bash
which -s percol
if [ $? -eq 0 ]; then
interactive_helper="percol"
fi
which -s peco
if [ $? -eq "0" ]; then
interactive_helper="peco"
fi
if [ ${interactive_helper} == "" ]; then
echo "abort: peco or percol requires to run"
exit 1
fi
displayresolutionselect=$(
displayplacer list |
/usr/bin/awk '
$1 == "Contextual" {
id=$4
}
$1 == "mode" {
printf "id:%s%s\n", id, $0
}' |
$interactive_helper
)
displayplacerparam=$(
echo $displayresolutionselect |
/usr/bin/awk '
BEGIN {
FS="[ :\t]+"
}
{
printf "%s:%s %s:%s\n", $1,$2,$3,$4
}'
)
if [ "${displayplacerparam}" == ": :" ]; then
echo "$0: cancelled"
exit 1
fi
displayplacer "${displayplacerparam}"
echo "change to \"${displayresolutionselect}\""