こんにちは。あやかです。

前回の記事でfzfとzsh-autosuggestionsを導入して、ターミナル操作がかなり快適になったんですが、今度はプロンプト自体をもっと見やすくしたいと思うようになりました。

特に、Gitを使っているときに今どのブランチにいるのか、変更があるのか、といった情報が一目で分かると便利だなと。あと、AWS CLIを使うときもプロファイルやリージョンが分かりやすいといいなと思っていたんですよね。

そこで出会ったのが「starship」というプロンプトカスタマイズツールです。

starshipとの出会い

zshをもっと使いやすくする方法を検索していたら、starshipというツールを見つけました。

starshipは、zshだけでなくbashやfishなど、さまざまなシェルで使えるクロスプラットフォームなプロンプトカスタマイズツールです。設定ファイル一つでプロンプトの見た目や表示内容を自由にカスタマイズできるのが特徴。

Rust製で動作も軽快らしいので、試してみることにしました。

カスタマイズ前のプロンプト

まず、starshipをインストールした直後のデフォルト状態がこちら。

starshipデフォルトのプロンプト
starshipデフォルトのプロンプト

シンプルで悪くないんですが、私の使い方だともう少し情報があった方が便利そうです。

特に気になっていたのは:

  • ディレクトリが省略されてフルパスが見えない
  • 現在時刻が分からない
  • Gitのブランチやステータスが見づらい
  • AWS CLIのプロファイルやリージョンが分からない

カスタマイズの方針

starshipの設定ファイルは ~/.config/starship.toml に作成します。

私が目指したのは:

  1. 視認性の向上 - 必要な情報が一目で分かる
  2. 操作性の向上 - 作業中に必要な情報がすぐ確認できる
  3. リアルタイム性 - 時刻が常に更新される

では、実際にカスタマイズしていった過程を紹介します。

1. ディレクトリ表示をフルパスに

最初に困ったのが、ディレクトリが省略されてしまうこと。デフォルトだと深い階層にいるときに、今どこにいるのか分かりづらかったんですよね。

[directory]
truncation_length = 0  # 0にするとフルパス表示
truncate_to_repo = false  # Gitリポジトリでも省略しない
format = "[$path]($style)[$read_only]($read_only_style) "

truncation_length = 0 にすることで、常にフルパスが表示されるようになりました。

2. Gitブランチとステータスの表示

次に追加したのが、Gitの情報です。

ブログ記事を書くときや、開発作業をするとき、今どのブランチにいて、変更があるかどうかが一目で分かると便利ですよね。

# Gitブランチ表示
[git_branch]
symbol = "🌱 "
format = "[$symbol$branch]($style) "
style = "bold purple"

# Gitステータス表示
[git_status]
format = '([\[$all_status$ahead_behind\]]($style) )'
style = "bold red"
conflicted = "🏳"
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕⇡${ahead_count}⇣${behind_count}"
untracked = "?${count}"
stashed = "📦"
modified = "!${count}"
staged = "✓${count}"
renamed = "»${count}"
deleted = "✘${count}"

実際にGitリポジトリで作業しているときの表示がこちら。

Gitステータスの表示例
Gitステータスの表示例

記号の意味は:

  • ? - 追跡されていないファイル(untracked)
  • ! - 変更されたファイル
  • - ステージング済みのファイル
  • - リモートより進んでいる
  • - リモートより遅れている
  • 📦 - stashされた変更

ファイルを編集したら [!1] と表示されて、git add したら [✓1] に変わる。これがリアルタイムで分かるのは本当に便利です。

3. コマンド実行時間の表示

AWS CLIとか、時間がかかる処理を実行したとき、どれくらいの時間がかかったのか知りたいことがありますよね。

[cmd_duration]
min_time = 500  # 500ms以上かかったコマンドの実行時間を表示
format = "took [$duration]($style) "
style = "bold yellow"

500ミリ秒以上かかったコマンドは、自動的に実行時間が表示されるようになりました。重い処理を走らせたときに、どれくらい待てばいいのか目安になります。

4. AWSプロファイルとリージョンの表示

私はAWS CLIを使うことが多いので、今どのプロファイルとリージョンで作業しているか分かると安心です。

[aws]
format = '[$symbol($profile )(\($region\) )]($style)'
symbol = "☁️ "
style = "bold yellow"
AWSプロファイルとリージョンの表示
AWSプロファイルとリージョンの表示

ハマったポイント: リージョンが表示されない

最初、プロファイル名は表示されるのに、リージョンが表示されなくて困りました。

原因は、~/.aws/config の設定でした。

# これだとダメ
[default]
region = ap-northeast-1

[profile test-profile]
# regionの記述がない

starshipは各プロファイルの設定を個別に見るので、[default]region 設定は他のプロファイルには引き継がれないんですね。

# 正しい設定
[default]
region = ap-northeast-1

[profile test-profile]
region = ap-northeast-1  # 各プロファイルに明示的に書く必要がある

各プロファイルに region を明示的に書いたら、ちゃんと表示されるようになりました。

5. 日付と時刻の表示 - そしてハマる

最後に追加したかったのが、現在時刻の表示です。

コマンドを実行した時刻が分かると、ログを見返すときとか、作業の記録を取るときに便利ですよね。

[time]
disabled = false
format = '🕐 [$time]($style) '
time_format = "%Y/%m/%d %T"  # yyyy/MM/dd HH:MM:SS形式
style = "bold white"

これで時刻は表示されるようになったんですが、問題が一つ。

時刻がリアルタイムで更新されない。

starshipの [time] モジュールは、プロンプトが表示される瞬間の時刻を表示する仕様なので、コマンドを実行するまで時刻が更新されないんです。

「リアルタイムで秒が進んでいく表示が欲しい」と思った私は、調べてみることにしました。

解決策: zshとの組み合わせ

starship単体ではリアルタイム更新できないことが分かったので、zshの機能を使うことにしました。

zshには TMOUTTRAPALRM という仕組みがあって、これを使えば定期的にプロンプトを再描画できるんです。

# ~/.zshrc に追加
eval "$(starship init zsh)"

# starshipのプロンプトを1秒ごとに再描画
TMOUT=1
TRAPALRM() {
    zle reset-prompt
}

仕組みの解説:

  • TMOUT=1 - 1秒間入力がないと、タイムアウトイベントを発生させる
  • TRAPALRM() - タイムアウトイベントが発生したときに実行される関数
  • zle reset-prompt - プロンプトを再描画する

これで、starshipのプロンプトが1秒ごとに再描画されて、時刻表示もリアルタイムで更新されるようになりました!

最終的な設定ファイル

~/.config/starship.toml

# ディレクトリ表示
[directory]
truncation_length = 0
truncate_to_repo = false
format = "[$path]($style)[$read_only]($read_only_style) "

# Gitブランチ表示
[git_branch]
symbol = "🌱 "
format = "[$symbol$branch]($style) "
style = "bold purple"

# Gitステータス表示
[git_status]
format = '([\[$all_status$ahead_behind\]]($style) )'
style = "bold red"
conflicted = "🏳"
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕⇡${ahead_count}⇣${behind_count}"
untracked = "?${count}"
stashed = "📦"
modified = "!${count}"
staged = "✓${count}"
renamed = "»${count}"
deleted = "✘${count}"

# コマンド実行時間
[cmd_duration]
min_time = 500
format = "took [$duration]($style) "
style = "bold yellow"

# AWS設定
[aws]
format = '[$symbol($profile )(\($region\) )]($style)'
symbol = "☁️ "
style = "bold yellow"

# 日付と時刻
[time]
disabled = false
format = '🕐 [$time]($style) '
time_format = "%Y/%m/%d %T"
style = "bold white"

~/.zshrc(追記部分)

# starship初期化
eval "$(starship init zsh)"

# リアルタイム時刻更新
TMOUT=1
TRAPALRM() {
    zle reset-prompt
}

カスタマイズ後の様子

最終的なプロンプトがこちら。

カスタマイズ後のプロンプト
カスタマイズ後のプロンプト

必要な情報が一目で分かるようになりました:

  • フルパスでどこにいるか明確
  • Gitのブランチとステータスが分かる
  • 重い処理の実行時間が表示される
  • AWSのプロファイルとリージョンが確認できる
  • 現在の日付と時刻がリアルタイムで更新される

使ってみた感想

実際に数日使ってみて、特に便利だと感じたのは:

Gitステータスの表示 ファイルを編集したり、git add したりすると、すぐにプロンプトに反映される。コミットし忘れとか、変更の取りこぼしが減りました。

AWSの表示 複数のプロファイルを使い分けているので、今どのプロファイルで作業しているか一目で分かるのは安心感があります。特に本番環境のプロファイルを使っているときは、視覚的に分かりやすくなって良かったです。

時刻のリアルタイム表示 コマンドを実行した時刻が記録される感覚で、作業ログを取るときに便利。「あのコマンドいつ実行したっけ?」という確認が楽になりました。

1秒ごとの再描画も、実際に使ってみると全く気になりません。

今後試したいこと

今回はまだ基本的なカスタマイズしかしていないので、今後はこんなことも試してみたいと思っています:

  • 他の言語環境の表示(Node.jsのバージョンとか)
  • カスタムコマンドの実行結果を表示
  • 色やアイコンのさらなる調整

starshipは設定項目がとても豊富なので、少しずつ自分好みにカスタマイズしていくのも楽しそうです。

まとめ

zshのプロンプトをstarshipでカスタマイズしてみました。

特に良かったポイント:

  • 設定ファイル一つで管理できる分かりやすさ
  • Gitの状態がリアルタイムで分かる便利さ
  • zshとの組み合わせで時刻をリアルタイム表示できた

ハマったポイント:

  • AWSのリージョン表示には各プロファイルへの明示的な設定が必要
  • リアルタイム時刻更新にはzsh側の設定が必要

前回のfzfとzsh-autosuggestionsに続いて、またターミナル環境が快適になりました。少しずつ自分好みの環境が整ってきて嬉しいです。

同じようにzshのプロンプトをカスタマイズしたい方の参考になれば幸いです。