zshのプロンプトテーマを自作した

自分用にzshのプロンプトテーマをRustで自作しました。 自分が常用しても問題ない程度の完成度になったので公開しました。

github.com

f:id:Ryooooooga:20191021210953p:plain
使用時の様子

セグメントの表示内容は左上から

  • OS
  • ユーザ名@ホスト名
  • (中間省略された) カレントディレクト
  • Gitブランチ
  • Gitユーザ
  • 直前の終了ステータス

となっています。(順番、色、表示/非表示などに関してはカスタマイズ可能)

まだREADMEが空っぽなので後で中身を書きます。

以前使用していたプロンプト

bobthefish

ログインシェルにfishを使用していた頃 (~ 2018年9月) はプロンプトテーマに bobthefish を使用していました。

github.com

高機能で、更に環境変数によってある程度のカスタマイズができる非常によいテーマでした。 特に、それまではデフォルトプロンプトのbashやfishしか使ってこなかったこともあり、Powerline系のセグメントやGit statusの表示などは一種のカルチャーショックでした。 なにより見た目がかっこいい。テンションがあがるものはよいものにきまっている。

中間pathの省略については好みが分かれるところだとは思いますが、自分はonにしていました。

agnoster.zsh-theme

zshに乗り換えてからは agnoster.zsh-theme をカスタマイズして使用していました。 agnoster.zsh-themeはbobthefish以前に開発されたテーマです。

github.com

github.com

f:id:Ryooooooga:20191021213138p:plain
カスタマイズしたagnoster.zsh-theme

変更の内容は

  • 中間path省略の実装
  • 入力位置を次行に
  • 直前の終了ステータスの値を表示
  • 環境変数でセグメントの色や表示/非表示を切り替えられるように
  • RPROMPTに直前のコマンドの実行時間を表示
  • 現在のGitユーザ名を表示

などです。

この1年ほどはこれを使用していましたが、以下のような不満がありました。

  • bobthefishに比べGit statusの情報が荒い (dirty/clean程度の情報しかわからない)
  • zshスクリプトで書かれているのでコードが読みにくい、書きにくい
  • 若干動作がもっさりしているような気がする

今回はzshスクリプトではなくRust、つまりネイティブな言語で実装することでもっさり感と書きやすさを解消したわけです。 ついでにGit statusの解像度をbobthefish程度にまで引き上げました。

他の候補

今回した自作したテーマ以外にも、ネイティブ言語で実装されたテーマは存在しています。

それぞれの特徴と、なぜそれらを使用しなかったかの理由を簡単に述べます。

silver

silver は、同じくRustで書かれたテーマです。bash, zsh, fishに対応しています。

github.com

gitコマンドをプロセスとして呼び出してその出力を利用するのではなく、libgit2を使用することで高速な表示を実現しています。 libgit2関係のコードはこのsilverを参考にさせてもらいました。

このテーマの不満点を以下に挙げます。

  • 入力位置を2行目にすることができない
  • Git statusの解像度がagnoster.zsh-themeと同程度
  • エラーが発生するとすぐにpanicする
  • mac向けのバイナリがGitHub Releaseに用意されていないので cargo install する必要があるが、自分用 dotfiles ではRustのインストールをしないようにしているので扱いが難しい

powerline-go

powerline-go はその名の通りGoで実装されたテーマです。同じくbash, zsh, fishに対応しています。 これは珍しく2行表示に対応したテーマです。

github.com

このテーマの不満点です。

ちなみにこのテーマはlibgit2を使用せず、gitコマンドの出力を利用してブランチなどの情報を表示しています。

自作テーマ

そういうわけでなんとなくテーマを自作することにしました。 開発はRustで行い、silverに倣ってlibgit2を利用しています。

デザインは基本的に (カスタマイズ後の)agnoster.zsh-theme をトレースしています。

また、$XDG_CONFIG_HOME/almel/ 以下 (もしくは $HOME/.config/almel/以下)にあるYAMLファイルを読み込むことでセグメントの表示順や表示の有無、色、アイコンなどを自由にカスタマイズできるようになっています。

表示速度に関しては、ざっくり1.5倍程度速くなりました。(zshのプリコンパイル機能は思ったよりつよい)

f:id:Ryooooooga:20191021224735p:plain
←agnoster.zsh-theme (カスタム) | 自作テーマ →

これから機能の拡張や高速化をしたりドキュメントを整えたりする予定です。 それから、現在はzshにしか対応していないのでbashにも対応させたいです。

インストール

適当にcrates.ioで公開したのでcargoからインストールできます。

cargoを利用したインストール

$ cargo install almel
$ eval "$(almel init zsh)"

zpluginを利用したインストール (現在はmac用のバイナリしか用意していない)

$ zplugin ice from"gh-r" as"program" mv"almel* -> almel"
$ zplugin load Ryooooooga/almel
$ eval "$(almel init zsh)"