starship を使用してプロンプトにコンテキスト情報を表示する

「今、自分はどのコンテキストにいるのか?」を知る

starship でプロンプトに表示可能な情報は大きく分けると 3 つです。

  1. 環境変数(ユーザ名, ホスト名, カレントディレクトリ, ...)
  2. git 情報(branch, status, ...)
  3. 言語情報(ruby, rust, node.js, ...)
  4. クラウド情報(aws, gcloud, azure)
  5. その他(時間や独自に表示したいカスタム情報)

シェルが提供している PS1 環境変数でも 1 や 2 は設定できますが、3 や 4 の環境の設定を包括して読み取ったうえで、ユーザに一括して設定可能なインターフェイスを提供したツールは今までなかったのではないでしょうか。コンテキストが複雑になればなるほど切り替えのコストも比例して大きくなっていきます。古き良き Unix の時代では開発者が「自分がどのコンテキストにいるか」を知る情報処理コストは限りなく小さいものでしたが、複雑さが増した現在の開発環境ではが雪だるま式に大きくなっている気がします(rbenv exec bundle exec ruby ...)

EC2 のプロンプト表示に AWS のリージョンと k8s のクラスタを表示

AWS リージョンの設定

AWS のリージョンは ~/.aws/config の設定が反映されるのでデフォルトは ap-northeast-1 のような表示ですが、ここではエイリアスによって絵文字にしています。私の場合、日本では ap-northeast-1(Tokyo), US では us-east-1(N.Virginia) しか使わないことがほとんどなので、国旗にしています (^_^;

~/.config/starship.toml

[aws]
format = '[$symbol($profile)($region)]($style) '
style = "bg:17 fg:214"
symbol = "🅰 "

[aws.region_aliases]
ap-northeast-1 = "🇯🇵 "
us-east-1 = "🇺🇸 "
Kubernetes クラスタの設定

EKS を使用している場合、ARN(Amazon Resource Name) がクラスタ名になります。そのままだとプロンプトに表示するには長すぎるので、こちらもエイリアスによって短縮しています。人間に優しい表示にする、という意味では DNS、Unix のエイリアス、URL shortening などと同じですね。同様に docker のコンテキストも設定可能です。

~/.config/starship.toml

[kubernetes]
format = "[$symbol$context]($style)"
symbol = "🅚 "
style = "bg:20 fg:255"
disabled = false

[kubernetes.context_aliases]
"arn:aws:eks:ap-northeast-1:123456789012:cluster/awesome-project-development-1" = "awesome-dev"
"arn:aws:eks:ap-northeast-1:123456789012:cluster/awesome-project-staging-1" = "awesome-stg"
"arn:aws:eks:ap-northeast-1:123456789012:cluster/awesome-project-production-1" = "awesome-prd"

現在の github/aws の設定が個人用か会社用かを表示

私の場合、github と aws のアカウントは個人用/会社用の設定ファイルをそれぞれ .home, .office という拡張子で別々に保存してシンボリックリンクで切り替えています。それぞれ h(ome), o(ffice) というコマンドで切り替わり、is-context-home-or-office という絵文字を返すコマンドを用意しています。これを starsthip のカスタム設定に与えれば現在の github/aws のアカウントがどちらかなのかをプロンプトから判断できるようになります。

[kyagi@kitakami.local ~/git/home] 🏠
➜ ls -l  ~/{.gitconfig,.aws/config}
lrwxr-xr-x  1 kyagi  staff  11  7 31 16:29 /Users/kyagi/.aws/config -> config.home
lrwxr-xr-x  1 kyagi  staff  15  7 31 16:29 /Users/kyagi/.gitconfig -> .gitconfig.home

[kyagi@kitakami.local ~/git/home] 🏠
➜ o
context: office, icon: 🏢, email: me@awesomecompany.com

[kyagi@kitakami.local ~/git/office] 🏢
➜ ls -l  ~/{.gitconfig,.aws/config}
lrwxr-xr-x  1 kyagi  staff  13  7 31 16:32 /Users/kyagi/.aws/config -> config.office
lrwxr-xr-x  1 kyagi  staff  17  7 31 16:32 /Users/kyagi/.gitconfig -> .gitconfig.office

[kyagi@kitakami.local ~/git/office] 🏢
➜ h
context: home, icon: 🏠, email: me@awesomeproprietor.net

[kyagi@kitakami.local ~/git/home] 🏠
➜ ls -l  ~/{.gitconfig,.aws/config}
lrwxr-xr-x  1 kyagi  staff  11  7 31 16:32 /Users/kyagi/.aws/config -> config.home
lrwxr-xr-x  1 kyagi  staff  15  7 31 16:32 /Users/kyagi/.gitconfig -> .gitconfig.home

~/.config/starship.toml

format = "$username$hostname$directory$custom$git_branch\n$character" # 1

(... snip ...)

[custom.context]
format = '[$symbol($output)]($style) '
symbol = ""
command = "is-context-home-or-office"

git branch の設定と Terminal on RubyMine

git branch のシンボルに を使用しています。なお、IntelliJ 製の IDE では背景色/文字色の設定を無視してくれるようです(ターミナルでは背景色:黒, 文字色:白)

[git_branch]
format = '[$symbol($branch)]($style) '
symbol = "ⓖ "
style = "bg:255 fg:0"
truncation_length = 128
truncation_symbol = ""
#ignore_branches = ["master", "main"]

プロンプトの昔と今、絵文字がもたらした革新

すっかりカラフルになったばかりか絵文字をふんだんに使用しているプロンプトはThe Linux Documentation Project の Bash Prompt HOWTO の時代と比較すると隔世の感があります。日本発の「絵文字」文化は一般的なメッセージアプリのみならず、我々 IT 業界のターミナルやコマンドラインツールまで革新をもたらしました。大げさかもしれませんが、文字よりも視認性にすぐれ、時に文字よりも多くの情報を伝えられる絵文字は 21 世紀における偉大な発明と言ってもいいのではないでしょうか。Slack や Discord のリアクションという新文化を生み出す土壌となった意味でもその功績は計り知れません。

参考情報