シェルスクリプトの表示を豊かにするgumの使い方

gumの素振りをしたので例とともに使い方を紹介します。
2022.09.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも。CX事業本部Delivery部のえーたん(@eetann092)です。

gumが面白そうだったので素振りしました。 gumのREADMEを読んで特に気になった部分を例とともに紹介します。

gumとは?

gumはシェルスクリプトの表示に彩りを添えるツールです。

gumを入力や選択画面を簡単に実装したりスタイルを変更できます。

Charmには、gumの他にもいくつかのCLIツールが掲載されています。

style

gum style [--オプション] "行1" "行2" "行3" ...の形式で、文字や背景、ボーダーの色などの装飾を指定して表示できます。

gum style \
    --background="#FDEE0F" \
    --foreground="#000904" \
    --border="double" \
    --border-background="#FDEE0F" \
    --border-foreground="#F30057" \
    --margin="1 2" \
    --padding="0 3 3 0" \
    '行1だよ!' \
    '行2です' \
    '行3だ!'

文字色や背景色はカラーコードで指定できます。 ボーダーのスタイルについては、実装によると2022-09-09現在は以下の6種類を指定できます。

  • double
  • hidden
  • none
  • normal
  • rounded
  • thick

marginpaddingについてはCSSと同じように【上下、左右】や【上、右、下、左】(時計回り)で指定できます。

join

gum join "$HOGE" "$FOO"の形式で、styleの表示を上下や左右に並べて表示できます。

CM=$(gum style --background="#FDEE0F" --foreground="#000904" --width=20 --padding="2 4 0 4" --align="center" 'Classmethod')
YEAR=$(gum style --background="#FDEE0F" --foreground="#41A1C1" --width=20 --padding="0 4 2 4" --align="right" '2022')
gum join --align right --vertical "$CM" "$YEAR"

オプション--alignを使うことで寄せの指定もできます。

format

formatを使えば、絵文字やシンタックスハイライトを効かせた表示ができます。

以下はMarkdownの表示です。

echo "# 見出し\n## 見出し\n### 見出し\n- リスト\n- リスト\n---\n~~あい~~\`inline code\`う**え**お\n>引用" | gum format

Markdown以外のシンタックスハイライトについては、筆者の環境ではまだうまく表示できていないため、解決したら掲載します。

絵文字は、Slackのように:hoge:の形式で入力できます。絵文字は、GitHubのAPIに掲載されているものが使えるそうです。

echo 'Kerry: :sunglasses: Yeah!' | gum format -t emoji

input

inputで入力画面を表示できます。

gum input --placeholder "Name?"

choose

chooseで選択画面を用意できます。

PERSON=$(gum choose "Kerry" "Johnny" "Goro")
echo "Hello, $PERSON"

上下移動にはカーソルキーの他、CTRL + n,CTRL + p,j,kも使えます。

また、一番上の選択肢にはg、一番下の選択肢にはshift + gで移動できます。 なんだかVimっぽいですね。

--limit--no-limitを使うことで、複数選択もできます。

confirm

confirmを使うことで、Yes/Noを簡単に表示できます。 Yesを選んだら終了ステータスは0、Noを選んだら1になります。

gum confirm "Yes?" && echo "Yeah!"

カーソルキーで移動、Enterで決定できます。 また、hで左へlで右へ移動したり、yでYesを選択、nでNoを選択できます。

write

writeを使えば、長文の入力画面を表示できます。

gum write

Enterは文章としての改行になるため、編集を完了したいときはCTRL + Dかエスケープキーを入力します。

filter

fzfのように「絞り込み」と「選択」ができます。

echo "Kerry\nJohnny\nGoro" | gum filter

spin

gum spin [オプション] -- コマンドの形式で、指定したコマンド実行中にスピナーを表示できます。

gum spin -- sleep 2

オプション--spinnerで違うタイプのスピナーが表示できます。筆者の好みはmoonです。

リンク集

本記事の執筆中にgumのドキュメント修正コントリビュートもしました。