zshのpromptにアクティブなgcloud configrationを表示する
小ネタ的なポストです。
仕事なりプライベートでGCPを使っていると、ターミナルからgcloudコマンドラインツール(以後「gcloudツール」)を使うことにもなろうかと思います。そしてGCPで複数のプロジェクトがあり、それぞれのプロジェクトのリソースに対してgcloudツールから操作する場合、複数の「configration」を設定して操作するプロジェクトに応じて対応するconfigrationをactivateしていることかと思います。
https://cloud.google.com/sdk/docs/configurations
ちなみに私はこのconfigrationの切り替えはpecoで行っています。
chgcp
と叩いたらconfigrationのリストがpecoで表示され、選択するとそのconfigrationがactivateされるという動きです。
たったこの4行ぽっちですがはちゃめちゃに便利で効果的に感じていて、これが無いと「ええいgcloudツールを使わないといけないGCPなんて使ってられるかーっ!」と荒々しく叫んでしまいそうです。
便利にしたい欲は絶えない
こうしてアクティブなconfigrationを変更することはカンタンにできるようにしたわけですが、今度はアクティブなconfigrationを確認するのが面倒という気持ちが芽生え始めました。
これは面倒という問題だけでなく、間違ったconfigrationをアクティブにしていたことによりオペミスが発生してしまう可能性が存在する問題です。
そして手っ取り早く「zshのpromptに常に現在アクティブなconfigration名を表示する」という方法でカンタンに確認できるようにしました。実装としては以下のような形です。
load_current_gcp_config() { local config_path="$HOME/.config/gcloud/active_config" if [ -f $config_path ]; then GCP_PROFILE=$(cat $config_path) fi } precmd() { psvar=() load_current_gcp_config psvar[1]=$GCP_PROFILE } local p_gcp="[gcp:%1v]" # 例えば右寄せで表示する RPROMPT="$p_gcp" # どこに表示するかは `$p_gcp` を `PROMPT` や `RPROMPT` 変数の差し込む場所で調整できる
実際に使っている筆者の設定はこんな感じです。
https://github.com/shirakiya/dotfiles/blob/master/zshrc#L168-L192
少し解説すると、
load_current_gcp_config
で現在アクティブなconfigrationを読み取っています。*1 そしてその load_current_gcp_config
を precmd
という関数から呼び、configration名が入った GCP_PROFILE
を psvar
配列に格納しています。
ここでミソなのが以下のポイントです。
precmd
: prompt表示前にフックされる関数psvar
: prompt表示時に使える配列。psvar[x]
の x にはintegerを与え、PROMPT側では%xv
で値を取り出せる
ref. https://zsh.sourceforge.io/Doc/Release/Prompt-Expansion.html#Prompt-Expansion
こんな感じになった
これでpromptに常にアクティブなconfigration名が表示されるようになったので、事故を未然に防げて便利になりました。
*1:もしgcloudツールの仕様変更でファイルパスが変わったりファイル名が変わったりするとこのコードは動かなくなる