シェルのプロンプトを StarShip でいい感じにする

Written on 2022-08-27

シェルのプロンプトの設定は、凝ろうと思ったら無限に時間が消費される。2022年時点、最も現代的でおすすめできる方法が StarShip だ。 従来、プロンプトの設定は環境変数やシェル関数などを組み合わせて、ググりながら暗号的なコードと格闘しなければならなかった。 StarShipはプロンプトの生成をRust製の実行ファイルに一任し、それ設定ファイルはTOMLファイルに抽象化されている。 クロスプラットフォーム(LinuxでもMacでもWindowsでも)、マルチシェル(zsh, fish, windows-power-shell, …)対応。 Nerd Font(Powerline font)を使ったカラフルな表示や現代的な機能にも、もちろん対応している。

oh-my-zsh? 無駄な労力ですね。

Nerd Font

事前準備として Nerd Font をインストールしておく。 従来は Powerline font などと呼ばれていたが、各種を統合してワンパッケージにしたものだ。 ついでに、フォント自体も好みのプログラミングフォントをインストールしておこう。

日本語も対応してているものとして、Cicaなどが使いやすいと思う。

Macの場合は展開して*.ttfファイルを~/Library/Fonts/にコピーするだけ。

私の場合は使い慣れた Ricty が好きなので自分で生成したが、わりとハマったのでこの文章の最後にまとめておく。

インストール

本家サイト参照。次のコマンドをコピペする。

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

本家サイトのとおり、使っているシェルに合わせて、初期化を仕込む。

zshの場合は.zshrc(これはインタラクティブシェルの場合だけ実行される)に次のように。

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

コマンドを手で実行してみればわかるが、starshipコマンドが ~/.config/starship.tomlファイルを読み込んでzsh用のコマンドシーケンスを生成し、シェルに評価させている。

設定

設定は、現代的に ~/.config/starship.tomlに記述する。~/.XXXXrcを使わずに~/.config/を使うところも現代的でお行儀が良い。

最初はデフォルトでも、いい感じに設定されているので、ほとんどの用途で満足がいくと思う。

一律のプロンプト設定ではなく、そのプロジェクトにGitリポがあるか、使用言語、実行環境などによって、自動判別で細かく表示がカスタマイズされ、必要な情報が表示されるが不要なものは省かれるようになっている。

starship-1.png

  • パスは、リポの場合はそこから上は表示されないのがデフォルト。
  • Gitレポの場合、ブランチ名を表示
  • これは、Rustのプロジェクトなので、このプロジェクトのCargoバージョン
  • カニアイコンとrustcのバージョン
  • もし未登録ファイルがあれば、その警告も
  • cargo buildなど時間がかかるコマンドは実行時間。lsの場合には表示されない。
  • $?が0でなければプロンプトの色が変わる。

Ricty Discord Nerd Fontの生成

古くからプログラミングフォントとしてRictyが存在して親しまれている。 とくに、自体が丸っこくて、フォントの「ふところ」が深く判別しやすいこと、「゜」「、」などの記号類が大きく分かりやすくなっていることなどが良い点だ。

しかし、元となるフォントのライセンスの関係上、ワンパッケージにしたフォントを配布することができない。元となるフォントをダウンロードして、手元で合成する、というハードルがある。ネットにある情報は古くなっていたりして、最新の環境ではハマることもあるので、私の手順を示しておこう。

作るのは Ricty Discord {Regular,Bold, Oblique, Bold Oblique} Nerd Font Complete.ttf

Discordというのは、一部のASCII文字をオリジナルのInconsolataから見やすい様に編集したもの(非調和と名付けられている)。

Rictyには再配布ライセンスの問題がないDiminishedもあるが、第二水準の一部の漢字が入っていない。

NerdフォントはComplete版(Nerd Fontプロジェクトにある可能な限りの絵文字が入っている)を結合。

参考

FontForgeのインストール

Macの場合。

❯ brew install fontforge

mapfile

あとのほうでmapfileコマンドを使う。これはbash組み込み関数なのだが、macに初期から入っているbash-3.2ではサポートされていない。brewでbashをインストールするとbash-5.1が入り、これだとサポートされている。

bash-3.2$ mapfile
bash: mapfile: command not found
bash-3.2$ brew instal bash
...
...
bash-3.2$ bash
bash-5.1$ mapfile
^C
bash-5.1$ 
bash-5.1$ exit

ダウンロード

  • Inconsolata
    • [https://fonts.google.com/specimen/Inconsolata]
  • Migu 1M
    • [http://mix-mplus-ipa.osdn.jp/migu/]
  • ricty_generator.sh
    • [https://rictyfonts.github.io]

素材フォントのRegularとBoldを作業ディレクトリにコピー

❯ cp migu-1m-20200307/migu-1m-regular.ttf .
❯ cp migu-1m-20200307/migu-1m-bold.ttf .
❯ ls -F     
migu-1m-bold.ttf
migu-1m-regular.ttf
Inconsolata-Bold.ttf
Inconsolata-Regular.ttf
ricty_generator.sh

Ricky Discordでバグがあるのでスクリプトを修正

私の場合、Ricty Discordの生成時に、r, 0の合成に失敗している。本来は生成スクリプトの修正で対処したかったのだが、無理だったので、FontForge.appで手動で修正した。後述。

Rictyを生成

❯ chmod a+x ricty_generator.sh 
❯ ./ricty_generator.sh auto
Ricty Generator 4.1.1
...
...

このコマンドで、Ricty-{Regular,Bold,Oblique,BoldOblique}, RictyDiscord-{Regular,Bold,Oblique,BoldOblique}。

❯ ls -lF Ricty*
-rw-r--r--  1 nkon  staff  3454152  8 27 12:38 Ricty-Bold.ttf
-rw-r--r--  1 nkon  staff  3681564  8 27 12:39 Ricty-BoldOblique.ttf
-rw-r--r--  1 nkon  staff  3408348  8 27 12:39 Ricty-Oblique.ttf
-rw-r--r--  1 nkon  staff  3184348  8 27 12:38 Ricty-Regular.ttf
-rw-r--r--  1 nkon  staff  3454276  8 27 12:38 RictyDiscord-Bold.ttf
-rw-r--r--  1 nkon  staff  3681752  8 27 12:39 RictyDiscord-BoldOblique.ttf
-rw-r--r--  1 nkon  staff  3408564  8 27 12:39 RictyDiscord-Oblique.ttf
-rw-r--r--  1 nkon  staff  3184500  8 27 12:38 RictyDiscord-Regular.ttf

テストしてみたらRictyDiscordの0,rがおかしい。

brewでインストールされているFontForge.appでフォントファイルを開いて、正しいグリフ(下の方にある)をコピーして、 「ファイル」→「フォントを出力」で修正した*.ttfを上書き保存する。

RictyとNerd Fontの合成

Nerd Font リポジトリをクローン

❯ git clone --depth=1 https://github.com/ryanoasis/nerd-fonts.git
Cloning into 'nerd-fonts'...
...
...

font-patcherを実行

上述のようにCompleteオプション(-c)をつける。

❯ ls Ricty* | xargs -n 1 python3 nerd-fonts/font-patcher -c
...
...
❯ ls -lF | grep Nerd
-rw-r--r--   1 nkon  staff  4424956  8 27 12:50 Ricty Bold Nerd Font Complete.ttf
-rw-r--r--   1 nkon  staff  4650336  8 27 12:50 Ricty Bold Oblique Nerd Font Complete.ttf
-rw-r--r--   1 nkon  staff  4425152  8 27 12:50 Ricty Discord Bold Nerd Font Complete.ttf
-rw-r--r--   1 nkon  staff  4650596  8 27 12:50 Ricty Discord Bold Oblique Nerd Font Complete.ttf
-rw-r--r--   1 nkon  staff  4381332  8 27 12:50 Ricty Discord Oblique Nerd Font Complete.ttf
-rw-r--r--   1 nkon  staff  4159240  8 27 12:50 Ricty Discord Regular Nerd Font Complete.ttf
-rw-r--r--   1 nkon  staff  4381044  8 27 12:50 Ricty Oblique Nerd Font Complete.ttf
-rw-r--r--   1 nkon  staff  4159016  8 27 12:50 Ricty Regular Nerd Font Complete.ttf

インストール

生成されたフォントをインストール

❯ cp Ricty\ Discord* ~/Library/Fonts/      

設定

GUIのソフトの場合、設定画面からそれらしいフォントを選べばOK。

Alacrittyの場合は~/.config/alacritty/alacritty.ymlに次のように書けばよい。

こういうところに書くフォントの名前は fc-list | grep Nerdなどとして調べる。

# Font
font:
    size: 13
    normal:
        family: 'RictyDiscord Nerd Font'
        style: Regular
    bold:
        family: 'RictyDiscord Nerd Font'
        style: Bold
    italic:
        family: 'RictyDiscord Nerd Font'
        style: Oblique
    bold_italic:
        family: 'RictyDiscord Nerd Font'
        style: Bold Oblique