世界を動かす技術を、日本語で。

スターシップ:あらゆるシェルに対応した最小限で高速、かつカスタマイズ可能なプロンプト

概要

  • Starship は、どのシェルでも使える 高速・最小限・無限カスタマイズ可能 なプロンプトツール
  • Rust製 で高速・安全性に優れ、シェルの起動が快適
  • 主要OS・主要シェル に幅広く対応し、どこでも同じ使い心地を実現
  • 導入には Nerd Font のインストールが必要
  • インストールや設定は シェルごとに簡単な手順 で完了

Starship:どのシェルにも対応する超高速プロンプト

  • Starship は、どんなシェル・OSでも動作する 汎用プロンプトツール
  • Rust言語 による実装で、プロンプト表示の 速度・安全性 を両立
  • 最小限から多機能まで、細部までカスタマイズ可能な設計
  • Nerd Font の導入が前提条件
  • 主要なシェル・OS で一貫した操作感を実現

インストール前提条件

  • Nerd Font のインストールとターミナルでの有効化が必須

Starshipのインストール手順

  • 最新版のインストール

    • シェルで下記コマンドを実行し、 公式インストーラ で導入
      • sh -c "$(curl -sS https://starship.rs/install.sh)"
    • アップデート も同じコマンドで実行
  • パッケージマネージャでのインストール

    • Homebrewbrew install starship
    • Wingetwinget install starship

シェルごとの初期化スクリプト設定

  • Bash

    • ~/.bashrcの末尾に追記
      • eval "$(starship init bash)"
  • Fish

    • ~/.config/fish/config.fishの末尾に追記
      • starship init fish | source
  • Zsh

    • ~/.zshrcの末尾に追記
      • eval "$(starship init zsh)"
  • Powershell

    • Microsoft.PowerShell_profile.ps1の末尾に追記
      • Invoke-Expression (&starship init powershell)
  • Ion

    • ~/.config/ion/initrcの末尾に追記
      • eval $(starship init ion)
  • Elvish (v0.18以上対応)

    • ~/.elvish/rc.elvの末尾に追記
      • eval (starship init elvish)
  • Tcsh

    • ~/.tcshrcの末尾に追記
      • eval \starship init tcsh``
  • Nushell (v0.96以上対応、今後変更予定)

    • $nu.config-pathで設定ファイルの場所を確認
    • 下記コマンドで設定ファイルを作成
      • mkdir ($nu.data-dir | path join "vendor/autoload")
        starship init nu | save -f ($nu.data-dir | path join "vendor/autoload/starship.nu")
        
  • Xonsh

    • ~/.xonshrcの末尾に追記
      • execx($(starship init xonsh))
  • Cmd (Clink v1.2.30+が必要)

    • starship.luaファイルを作成し、Clinkのscriptsディレクトリに配置
      • -- starship.lua
        load(io.popen('starship init cmd'):read("*a"))()
        

注意事項

  • Elvish はv0.18以降のみ対応
  • Nushell はv0.96以降のみ対応、今後設定方法が変わる予定
  • Cmd ではClinkの使用が必須

まとめ

  • Starship は、どのシェルでも一貫したプロンプト体験を提供
  • 高速・安全・柔軟なカスタマイズ性 を兼ね備えた次世代ツール
  • 導入・設定もシンプルで、すぐに使い始め可能

Hackerたちの意見

なんでこれが「ミニマル」って売り出されてるのか全然わからない。機能がたくさんあって、誰かが使ってるのを見るたびに、すごいプロンプトが出てきて、いろんな装飾がついてる。俺のシェルプロンプトはこれだよ: : ▶ ミニマルでいるために、全体のシェルプロンプトカスタマイズフレームワークなんて必要ないんだ。

そう、これはミニマルじゃなくて、マキシマリズムだよ。情報が多すぎて、文字も多い。もっとマキシマリストなプロンプトを受け入れた方がいい。

他のシェルやプロンプトと比べると、設定は本当にシンプルでミニマルだよ。ちょっと複雑なものが欲しいなら、これで十分。

俺のはもっと細い矢印だよ。# クリーンでシンプル、ミニマル PROMPT='%{%F{red}%}%~ %{%F{yellow}%}% › %{%F{reset_color}%}%'

シェルが git status を表示するのに100msかかるたびに、必要ないのに流れに見えない税金を払ってる感じだ。ターミナルは反応的なメモリツールであって、受動的な装飾じゃない。コードの実行時間を最適化してるけど、自分のタイピングの遅延には気を使ってない。

Starshipはめっちゃ速いよ。データを集めるのに数ミリ秒しかかからないし、集める内容を簡単に設定できるから、時間を無駄にしないようにできる。今まで試した他のやつとは雲泥の差で、100ミリ秒くらいの遅延にはイライラしてたからね。

例えば、VS CodeやGitHubのオンラインエディタに慣れてる人なら、キーボードを押してから画面に文字が表示されるまでに数万ミリ秒かかることもあるから、100ミリ秒なんて雷のように感じるよ。

コードの実行時間は最適化してるけど、自分のタイピングの遅延はあんまり考えてないな。100ミリ秒の最適化はCPUと人間の脳では全然違うし。毎回プロンプトでシステムログを全部出すのは擁護しないけど、ちょっとした便利機能は人間にとって数ミリ秒の計算時間の価値があると思う。例えば、プロンプトが100ミリ秒かかってgitのブランチやステータスを表示するのが「流れ」を壊すとは思えないし、自分でコマンドを打って時間がかかるのはどうなんだろうね。膨張と使いやすさのバランスが大事だと思うけど、極端な膨張か極端なミニマリズムのどちらかに偏るのは逆効果な気がする。

こういうプロンプトツールって、ユーザーに戻す前に表示されたプロンプトを編集するためにTUIスタイルの機能を使えたりしないかな?kubectlやgit、aws cliが200msかかっても問題ないし、これらのコマンドの出力データはプロンプトがユーザーに戻った後に数秒で表示されるから、ユーザーはプロンプトが準備できるのを待ってる感じがしないんだよね。

遅延は確かにイライラするよね。私はkittyターミナルのパッチ版を使ってて、starshipプロンプトをウィンドウの下に移動させてるんだ。vimやemacsみたいにね。モデルラインの更新が非同期だから、大きなgitリポジトリでもシェルプロンプトはすごくサクサク動くよ。ただ、kittyをパッチしなきゃいけないのが難点で、個人的なプロジェクトはLinux以外では試したことがないんだ。 https://github.com/mbachry/kitty-modeline

逆に、常に頭の中でgitのステータスを追いかけたり、自分に思い出させるためにコマンドを打たなきゃいけないのは、もっと大きな気が散る要因だよね。数ミリ秒の遅延のためじゃなくて、コンテキストスイッチを避けるように最適化すべきだと思う。ちなみに、私はzshのデフォルトからstarshipに切り替えたけど、特に違いは感じなかったよ。でも、gitのコミットを間違えたときは確実に気づくね!

コードの実行時間を最適化するけど、自分のタイピングの遅延は最適化しない。 フレームワークのレイヤーがあるから、逆のことが言えるんじゃない?

マキシマリストなプロンプトが好きなんだ。実際、StarshipはShell Bling Ubuntuが新しい開発マシンにインストールするものだよ。でも、みんなに合うわけじゃない。もし誰かにプロンプトに追加できるミニマムとマキシマムの最高密度のものを勧めるとしたら、それは単に現在のプロンプトが表示された時間と、最後に実行したコマンドがかかった時間だね。この2つの情報があれば、何がいつ起こったのかを簡単に把握できる。こういう擬似的な否認防止は、予期しないデバッグセッションにとって非常に貴重だよ。これは数年前にMichael W. Lucasの『Networking for System Administrators』から得たヒントで、実際のネットワークエンジニアと話すときに完全に迷子にならないために、ネットワーキングについてちょっとだけ学びたい開発者におすすめしてる。UNIXエポックからの秒数で時間を測ると、さらにオタクポイントがもらえるよ。それをやると、時間差の計算がすごく簡単で早いからね。

個人用ワークステーションなら、現在のディレクトリだけで十分だね。最後のコマンドの状態に応じて色を変えるかもしれない。それがコマンドを入力する前に必要な情報のほとんどだよ。他の情報は本当に必要なときにアクセスすればいい。

プロンプトの設定は全然気にしてなかったな。だって、emacsの中で必要な情報はほとんど見えてたから。実際、もっとペア作業をするようになってからStarshipを設定したんだ。自分のためというより、画面を見てる人や作業を確認してる人のためだった。特に本番環境で何を実行するか確認する時はね。自分のセットアップを見せる必要がないように、別のターミナルアプリを使ってるよ。

最後のコマンドの終了コードは、似たような理由で役立つよ。

これが好きなのは、インストールが一回で済んで、あとはいじる必要がないから。そんなことに時間をかけたくないけど、今のシェルがノード20か22、Rustの安定版かナイトリーかは知りたい。余計な手間なしでそれが分かるのは最高だね。

嫌な意見は無視して - 自分もターミナルではミニマリズムが好きだから、余計なごちゃごちゃは好きじゃない。でも、文脈が大事で、Starshipはそれに合わせて設定できる。デフォルトでは、プロンプトに現在のディレクトリ、時間、そして「%」の一文字が表示される。もしKUBECONFIGやOS_CLOUDみたいな文脈を意識する必要がある環境変数を設定すれば、プロンプトもそれに合わせて更新される。言語についても、自動でGoやPythonのバージョンを表示してくれるし、これらは全部自分でコントロールできる。Starshipが好きな理由は、設定がめっちゃ簡単だから。難解なZshの設定や追加プラグインを通らなくてもいいし、初期化のオーバーヘッドもほとんどないよ。

数年前にStarshipを試したけど、ちょっと「余計」だし、遅いと感じたな。今は改善されてるかもしれないけど、結局は素晴らしいHydroに落ち着いたよ。これはfish専用だけどね。すごくミニマルで、便利な機能があるんだ: - パイプラインのための終了コード - gitのブランチやステータス(ツリーが汚れてるとドットで表示) - コマンド実行時間(設定した閾値を超えたら表示) - 短縮された$CWDで、常にgitルートの名前を維持(好きな時もあれば、そうでない時もあるけど、変更は簡単) - 現在のviライクなモード(使ってないけど) すごく速くて非同期だし(プロンプトの再描画が入力やコマンドの実行をブロックしない)、fishのコードは132行だよ(clocによると)。変数を通じて非常にカスタマイズ可能で、ユニバーサルに宣言すれば、開いているすべてのセッションで即座に変更できる。fishを使っていてこの機能セットが好きなら、ぜひ試してみて!もしくは、カスタムプロンプトのベースとしてコードを見てみてね :P

Starshipのファンだよ。今まで見たことに基づいていくつかコメントを残したいな。パフォーマンスが大好き。Rustで書かれてコンパイルされたバイナリだから、PythonベースのPowerlineやbash-shellベースのohmybash、zshellベースのohmyzshやspaceshipよりもずっと速い。zsh、bash、sh、fishで使えるし、MS WindowsのCMDやPowershellでも使える。こんなに全部同時にできるプロンプトツールは他にないと思う。1つの設定ファイルでシステム内のすべてをコントロールできるし、デフォルトの設定はあくまでデフォルト。情報が多すぎる?変更できるよ。アイコンが嫌い?削除できる。ほぼ100のモジュールから選べるから、カスタマイズの選択肢はほぼ無限大だよ。

あの小さな動画ループで「false; true」コマンドが何を示しているのか理解しようとしてるんだけど、誰か教えてくれない?

面白いね。私は何年もpieテーマのfishを使ってて、いろいろ問題もあるけど、OMFで自分に合うものは見つけられなかったんだ。あと、設定にOMFの依存関係があるのも好きじゃない。そろそろ自分のシェルプロンプトを一から書く時期なのかもね。

以前はStarshipを使ってたけど、powerlevel10kに切り替えたんだ。もう一度Starshipを試してみたい理由があるかどうか考えてるんだけど、powerlevel10kはすごく簡単に始められたのを覚えてるなぁ……