じゃあ、おうちで学べる

本能を呼び覚ますこのコードに、君は抗えるか

年始にstarshipでプロンプトの式年遷宮を行いたい

適応は適応力を阻害する

はじめに

開発環境の最適化は、現代のソフトウェア開発において重要な課題です。また、その更新には式年遷宮のように、定期的な刷新には技術の継承と革新という二つの側面があります。しかし、過度な適応は適応力を阻害するという逆説もあります。この視点から、私は開発環境を定期的に見直し、必要な変更を加えています。

昨年、その一環としてターミナルエミュレータをWarpに移行しました。Warpは洗練されたUIと優れた機能性を備え、AIによるコマンド提案やブロックベースの出力表示など、モダンな機能により開発効率を大きく向上させてくれました。

agnozingdays.hatenablog.com

2025年を迎え、新たな改善として開発環境のさらなる最適化を目指しています。特に注目したのが、日々の開発作業で最も頻繁に目にするターミナルのプロンプトです。より詳細な開発環境の状態把握を実現するため、高速でカスタマイズ性の高いクロスシェルプロンプト「starship」の導入を決めました。

この記事では、Fishシェルをベースにしたstarshipの導入過程と、具体的な設定内容を共有します。また、WarpとFish、そしてstarshipの組み合わせがもたらす相乗効果についても詳しく解説していきます。

starship.rs

starshipの特徴と選択理由

starshipは、任意のシェルで動作する、高速で柔軟なプロンプトです。Rustで書かれており、システムリソースを最小限に抑えながら、豊富な情報を表示できることが特徴です。私がstarshipを選択した主な理由は以下の点です。

まず、クロスシェル対応という特徴が魅力的でした。開発環境によってbash、zsh、fishなど異なるシェルを使用することがありますが、starshipならば一つの設定ファイルですべてのシェルで同じ見た目と機能を実現できます。

次に、Rustで実装されているという点も重要でした。シェルの起動時やプロンプトの更新時のパフォーマンスが優れており、ストレスなく使用できます。特に大規模なGitリポジトリでの作業時でも、プロンプトの更新による遅延をほとんど感じません。

また、モジュール式の設計により、必要な情報だけを選択して表示できる点も気に入っています。開発言語やツールの追加・削除が容易で、環境の変化に合わせて柔軟に対応できます。

starship.rs

インストールと初期設定

私は普段からFishシェルを使用しているため、まずFishのインストール状況を確認しました。macOSではHomebrewを使ってFishをインストールしています。

brew install fish

続いて、starshipもHomebrewでインストールしました:

brew install starship

なお、他のOS環境では公式のインストールスクリプトを使用することもできます。

curl -sS https://starship.rs/install.sh | sh

Fishシェルの場合、~/.config/fish/config.fishの末尾に以下の初期化コードを追加します。

starship init fish | source

この設定により、Fishシェルの起動時に自動的にstarshipが初期化されます。私の場合、既にFishの設定ファイルにはテーマやエイリアスなどの設定が含まれていましたが、starshipはそれらと競合することなく動作しています。特に、Fishの持つ構文ハイライトや補完機能との相性が良く、快適な開発環境を実現できています。

プロンプトの詳細設定

starship.rs

starshipの設定は~/.config/starship.tomlで行います。私の設定では、開発で使用する様々なツールの状態を視覚的に把握できるように工夫しています。

github.com

それ以外にも設定のサンプルがあるの使ってみたり、参考にしてもよいかもです。

starship.rs

プロンプトのレイアウト設定

formatセクションでは、プロンプトの全体的な構造を定義しています。パワーライン風のデザインを採用し、各モジュール間を矢印で滑らかに接続しています。

format = """
[](fg:#9A348E)\
$directory\
[](fg:#DA627D bg:#9A348E)\
$git_branch\
$git_status\
[](fg:#FCA17D bg:#DA627D)\
$kubernetes\
[](fg:#86BBD8 bg:#FCA17D)\
$aws\
...

このように、各セグメントの背景色を前後で調整することで、矢印型のつなぎ目を実現しています。色は、視認性とアクセシビリティを考慮して選択しました。

ディレクトリ表示の最適化

カレントディレクトリの表示は、開発作業において最も基本的な情報です。

[directory]
style = "fg:#E4E4E4 bg:#9A348E"
format = '[ $path ]($style)'
truncation_length = 3
truncation_symbol = "…/"

truncation_length = 3の設定により、ディレクトリの深さが3階層を超える場合は自動的に省略されます。これにより、長いパスでもプロンプトが横に広がりすぎることを防いでいます。また、truncation_symbol = "…/"で省略部分を直感的に表現しています。

Git情報の詳細表示

Git関連の情報は、開発作業において特に重要です。

[git_branch]
symbol = " "
style = "fg:#E4E4E4 bg:#DA627D"
format = '[ $symbol$branch ]($style)'

[git_status]
style = "fg:#E4E4E4 bg:#DA627D"
format = '[$all_status$ahead_behind ]($style)'
conflicted = "≠"
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕"
untracked = "±${count}"
stashed = "※"
modified = "!${count}"
staged = "+${count}"
renamed = "»${count}"
deleted = "×${count}"

Gitの状態を直感的なアイコンで表現することで、リポジトリの状態を一目で把握できます。特に以下の状態を重視しています。

  • コンフリクトの発生(≠)
  • プッシュ・プル待ちの変更(⇡/⇣)
  • 作業ディレクトリの状態(未追跡、変更、ステージング)
  • スタッシュの存在(※)

これらの情報をコンパクトに表示することで、Git操作のミスを防ぎ、効率的な作業を実現しています。

クラウドと開発環境の状態表示

現代の開発では、複数のクラウドサービスやコンテナ環境を使用することが一般的です。

[kubernetes]
symbol = "☸ "
style = "fg:#E4E4E4 bg:#FCA17D"
format = '[ $symbol$context(\($namespace\)) ]($style)'
disabled = false

[aws]
symbol = "☁ "
style = "fg:#E4E4E4 bg:#86BBD8"
format = '[ $symbol($profile)(\($region\)) ]($style)'
disabled = false

[docker_context]
symbol = "🐋 "
style = "fg:#E4E4E4 bg:#33658A"
format = '[ $symbol$context ]($style)'

これらの設定により、以下の情報を常に把握できます。

  • Kubernetesのコンテキストとネームスペース
  • AWSとGoogle Cloud プロファイルとリージョン
  • Dockerのコンテキスト

特にマルチクラウド環境での作業時に、誤った環境で操作してしまうリスクを軽減できます。

プログラミング言語とツールのバージョン表示

各プログラミング言語やツールのバージョン情報も、プロジェクトごとに適切に表示されます。

[golang]
symbol = "🐹 "
style = "fg:#E4E4E4 bg:#06969A"
format = '[ $symbol($version) ]($style)'

[python]
symbol = "🐍 "
style = "fg:#E4E4E4 bg:#1B9F62"
format = '[ $symbol($version) ]($style)'
detect_extensions = ["py"]
python_binary = ["python", "python3"]

[nodejs]
symbol = "⬢ "
style = "fg:#E4E4E4 bg:#33658A"
format = '[ $symbol($version) ]($style)'
detect_extensions = ["js", "ts", "tsx"]
detect_files = ["package.json", "tsconfig.json"]

[rust]
symbol = "âš™ "
style = "fg:#E4E4E4 bg:#86BBD8"
format = '[ $symbol($version) ]($style)'
detect_extensions = ["rs"]
detect_files = ["Cargo.toml", "Cargo.lock"]

各言語の設定では、以下の点に注意を払っています。

  1. 適切なファイル検出設定(認知が追いつかない部分を勝手に取得できるように)
  2. わかりやすいアイコンの選択(環境を間違って死なないように)
  3. バージョン情報の明確な表示(バージョンの勘違いで泣かないように)

また、Terraform、Google Cloudなどのインフラ関連ツールも同様に設定しています。

[terraform]
symbol = "🏗 "
style = "fg:#E4E4E4 bg:#06969A"
format = '[ $symbol$workspace ]($style)'

[gcloud]
symbol = "🌐 "
style = "fg:#E4E4E4 bg:#33658A"
format = '[ $symbol$account(@$domain)(\($project\)) ]($style)'

時刻表示とプロンプト文字

作業時間の管理や、コマンド実行時刻の記録のために、時刻表示も含めています。

[time]
disabled = false
time_format = "%R"
style = "fg:#E4E4E4 bg:#86BBD8"
format = '[ $time ]($style)'

[character]
success_symbol = "❯"
error_symbol = "❯"
vimcmd_symbol = "❮"

24時間形式で時刻を表示し、コマンドの実行状態に応じてプロンプト文字を変更します。特にvimモードを使用している場合は、モードの切り替えが一目でわかるようになっています。

おわりに

starshipを導入して一週間が経過しましたが、starshipの導入により、開発環境の視認性と操作性が大きく向上しました。新年を迎えるにあたっての環境整備として、非常に満足のいく選択だったと感じています。

この設定は、私の開発スタイルに合わせて最適化したものですが、starshipの柔軟な設定システムを活用することで、誰でも自分に最適な開発環境を構築できます。ぜひ皆さんも、自分の作業スタイルに合わせたカスタマイズを試してみてください。

設定ファイルは公開していますので、参考にしていただければ幸いです。また、今後も開発環境の改善を続け、さらに効率的な開発環境を目指していきたいと思います。