🍬

gum を使ってシェルスクリプトの表示をカッコよくする

2022/09/17に公開

Twitter で見かけて触ってみたらかなり良かったので備忘録。

https://github.com/charmbracelet/gum

検証環境

  • gum v0.6.0

インストール

Mac の場合は Homebrew を使ってインストールできます。

$ brew install gum

また、 Go で作られているため go install でインストールすることもできます。

$ go install github.com/charmbracelet/gum@latest

その他のインストール方法については公式の README をご参照ください。

使い方

gum input - 1 行の入力を受け取る

1 行のテキスト入力を受け取ります。
入力されたテキストは標準出力に出力されます。

gum write - 複数行の入力を受け取る

複数行のテキスト入力を受け取ります。
Ctrl+D で入力を終了し、入力されたテキストは標準出力に出力されます。

gum filter - リストからフィルタリングして選択する

リストから Fuzzy マッチングを使用したフィルタリングを行い対話的にアイテムを選択できます。
選択されたアイテムは標準出力に出力されます。
また、 --limit--no-limit フラグを使用することで複数選択することも可能です。

gum choose - リストから選択する

リストからアイテムを対話的に選択できます。
選択されたアイテムは標準出力に出力されます。
また、 --limit--no-limit フラグを使用することで複数選択することも可能です。

gum confirm - Yes/No を表示する

選択可能な Yes/No を表示します。
左右矢印キー ( もしくは h, l ) でカーソルを移動します。
Yes を選択した場合の終了コードは 0 になり、 No を選択した場合の終了コードは 1 になります。

gum spin - コマンドの実行中にスピナーを表示する

gum spin -- <コマンド> のように実行し、コマンドが終了するまでスピナーを表示します。

gum style - テキストを装飾する

文字色や背景色、様々なスタイルや枠線などを指定してテキストを装飾して出力します。

gum join - テキストを連結する

複数のテキストを縦もしくは横に連結して出力します。
gum style と一緒に使うことを想定しているようです。

gum format - テンプレートを使用してテキストを装飾する

テンプレートを使用してテキストを装飾して出力します。
テンプレートは --type フラグで指定することができ、デフォルトではマークダウンが使用されます。

他のコマンドと組み合わせていい感じに実行する例

git commit

gum inputgum write を使用して、対話的にコミットメッセージを入力するコマンド例。

$ git commit \
  -m "$(gum input --placeholder "Summary of this change")" \
  -m "$(gum write --placeholder "Details of changes (CTRL+D to finish)")"

ブランチを切り替える

gum filter を使用し、対話的にブランチを切り替えるコマンド例。

$ git branch | cut -c 3- | gum filter | xargs git switch

Docker イメージを削除する

ローカルの Docker イメージを対話的に複数選択して削除するコマンド例。

$ docker image ls \
  | sed -e '1d' \
  | awk '{printf("%s:%s\n", $1, $2)}' \
  | gum filter --no-limit \
  | xargs docker image rm

公式サンプル

様々な使用例がまとめられています。

https://github.com/charmbracelet/gum/tree/main/examples

まとめ

シェルスクリプトの表示を簡単におしゃれにできてとっても良い感じです。
内部的には bubbletea という Go 製の TUI フレームワークが使われているようです。

https://github.com/charmbracelet/bubbletea

また、 gumbubbletea を開発している Charm は他にも様々なツールやライブラリを公開しています。
詳しくは下記ページをご参照ください。

https://charm.sh/

Discussion