pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


macOSで解像度変更をコマンドで実行できるdisplayplacerを対話的に利用するスクリプトを書く

先日、次の記事でmacOSの画面解像度をコマンドラインで変更できるツールを紹介したのですが、利用可能な解像度を探して手入力するのが面倒に感じたので、対話的に選んで実行できるラッパースクリプトを書きました。

pslabo.hatenablog.com

実行すると利用可能な解像度一覧が表示されます。一覧はインクリメンタルサーチで候補を絞り込めます。この操作のために peco or percol を使用します。 f:id:pslabo:20200723185808g:plain

このような機能を次の実装で実現しています。

  1. displayplacer list を実行して display id と mode をリスト化する
  2. リストを peco or percol で選択できるようにする
  3. 選択されたリストから 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}\""