Rust 製ツールでおしゃれなターミナル環境を作る【Starship ✕ exa】

commits8 min read

はじめに

エンジニアとして仕事をする中で PC からターミナルを使って作業することがとても多いです。エンジニアをしている人はこだわりが強く、それぞれ自分の作業しやすい環境を確立させている人が多い印象です。私も毎日使うものや作業環境は日々使いやすいようにカスタマイズするのが好きでいろんなツールについて常日頃から情報収集しています。

エンジニアに限らず、日々使うものをこだわったり、自分の使いやすいようにカスタマイズすることでやる気が高まり作業効率のアップ、生産性の向上に繋がります

最近、GitHub などで Rust 製のコマンドやプロンプトが注目されているのが気になり「ターミナルをもっとおしゃれに使いたい」と思いから、今回は、Starship という Rust 製のプロンプトと Rust 製コマンド exa を活用してモダンかつ軽量、おしゃれなターミナル、シェル環境を構築してみました。

今回作成したものがこちらです。

starship x exa で作成したターミナル画像
プロンプトはStarship、アイコンツリー表示にexaを使用

Starship で作業ブランチ名と Node.js のバージョンを表示し、exa を使ってアイコン付きのツリー表示で React のプロジェクトを開いた様子です。カラフルな表示とアイコンフォントで視認性を上げつつ、全体的にモダンな雰囲気になりました。

またターミナルのテーマには Dracula を使用しています。今回使用する Starship と色合いが似ており、テーマと合わせることで全体的に雰囲気がでておしゃれになります。Dracula は Windows Terminal や iTerm2 など多くのツールに対応しています。

https://draculatheme.com/

今回使用する環境

今回は以下の環境、バージョンにてそれぞれターミナルを構築しました。

[Windows]

  • Windows Terminal バージョン: 1.7.1033.0
  • WSL2(Ubuntu 20.04 LTS)
  • Zsh 1.56.0

[Mac]

  • iTerm2 Build 3.4.8
  • macOS BigSur バージョン 11.3
  • Zsh 1.56.0

私は、開発で Windows と macOS を両方使用しておりターミナルツールとしてそれぞれ Windows ではWindows Terminal、Mac ではiTerm2を使用しています。Rust 製ツールは互換性が重視されており、異なる環境であっても簡単に同じような環境を作成できるのが大きなメリットです。

Starshipを導入する

まず、Rust 製のシェルプロンプト「Starship」を導入します。

公式サイトはこちらです。

https://starship.rs/ja-jp/

「互換性優先」「Rust 製」「カスタマイズ可能」という三拍子揃ったモダンなプロンプトになります。サイトを見てすぐわかりますが、公式が日本語のドキュメントを用意してくれています。デフォルトでカラフルな表示と絵文字の表示をしてくれるおしゃれなプロンプトです。互換性優先で設計されており、OS やシェルを選ばずにインストールできるため複数の端末で同じ環境を揃えやすい、乗り換えやすいというメリットがあります。

インストール

公式サイトにそれぞれの環境でのインストールが詳しく紹介されているので簡潔にまとめます。

WSL2 で Ubuntu などを利用している場合は以下のスクリプトを使ったインストールが簡単です。

$ sh -c "$(curl -fsSL https://starship.rs/install.sh)"

✓ Starship installed 表示されればインストールは完了です。またこのやり方でインストールした場合、Starship の更新も同じコマンドで行います。アップデートする際は設定ファイルを変えることなく環境を引き続きながらバージョンを置き換えてくれます。

また Mac などでパッケージ管理に Homebrew を使っている場合は以下のコマンドでもインストールできます。

$ brew install starship

初期設定 : Starshipの有効化

Starship を有効にするたの処理をシェルプロファイルへ記述する必要があります。

シェルに Zsh を使用している場合は以下のようにします。

zsh
# .zshrcの末尾に追記
echo eval "$(starship init zsh)" >> ~/.zshrc

# シェルの再読み込み
source ~/.zshrc

Bash を使用している場合は以下のようになります。

bash
# .bashrcの末尾に追記
echo eval "$(starship init bash)" >> ~/.bashrc

# シェルの再読み込み
source ~/.bashrc

シェルの再読み込みをすることで Starship が有効になり以下のような表示に変わります。

# デフォルトの表示
~
❯

eval "$(starship init zsh)" は必ずファイルの末尾に記述してある必要があります。シェルを再起動しても有効にならない場合は記述位置を見直して見てください。

初期設定 : フォントの導入

Starship はアイコンフォントに対応しているため使用しているフォントがアイコンフォントに対応していないと一部文字化けする可能性があります。公式は NerdFont の導入を推奨しているため、Nerd フォントが手元にない場合は以下から探してみてください。また後述する exa というコマンドもアイコンフォントに対応しているため、導入することをおすすめします。

https://www.nerdfonts.com/

私は、たわら様が開発しているプログラミングフォント「白源(はくげん/HackGen)」をターミナルのフォントに使用しています。

https://github.com/yuru7/HackGen

NerdFont を追加した「HackGenNerd Console」というフォントがあるため、こちらをインストールして使用することでアイコンフォントも問題なく表示できます。またプログラミングフォントのため文字の識別がしやすい点もおすすめです。

Starshipのカスタマイズ

Starship はデフォルトでもアイコンフォントの表示やカラフルな表示に対応しており便利なのですが、設定ファイルを作成して使用することでより細かい設定が可能となります。

$ starship config

とすることで ~/.config の下に starship.toml という設定ファイルが作成され開かれます。

設定できる項目がかなり多く、自由なカスタマイズが可能です。詳しくは設定 | Starshipを見てみてください。上記の画像では以下の設定をしています。

starship.toml
# 空行追加
add_newline = true

# タイムアウト時間
scan_timeout = 10

# 記号の設定
[character]
success_symbol = "[▶](bold green)" # コマンド成功時
error_symbol = "[▶](bold red)"    # コマンド失敗時

exaを導入する

exa とは Linux でおなじみの ls コマンドを更に拡張したコマンドになります。こちらも Rust 製でとても扱いやすいものになっております。デフォルトでカラフルな表示とオプションを使用した詳細表示に対応しており前述した Starship ととても相性がいいです。

GitHub リポジトリはこちらになります。

https://github.com/ogham/exa

exa コマンドはインストール方法が多数ありディストリビューションによって大きく異なります。この記事内では Homebrew を使用したインストールと Cargo を使用したインストールを紹介します。

Homebrew を使用したインストール

パッケージ管理に Homebrew を使用している場合は以下のコマンドでインストールできます。

$ brew install exa

WSL2 で Ubuntu を使用している場合であっても Homebrew を導入することで同じようにインストールできます。私は WSL2 において Homebrew を導入した上で exa コマンドを導入しています。WSL2 上の Ubuntu20.04 LTS に Homebrew を導入するやり方は過去にこちらの記事にて紹介しています。

Cargoを使用したインストール

Rust のビルドシステム兼パッケージマネージャーの Cargo を使用して exa を導入する方法です。

Cargo を使用するために Rust の環境を作る必要があるのですが、今回は rustup というツールを使い簡単に始めます。

https://github.com/rust-lang/rustup/blob/master/README.md

rustup とは Rust の公式ドキュメント内でも推奨されているツールで、ワンライナーで Rust 環境構築を簡単に行えるスグレモノです。以下のワンライナーを実行して Rust をインストールできます。

# rutupをインストール
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

インストールの途中で質問されたらエンターを押して続行します。デフォルトで 1 の(Proceed with installation)が選択されます。そのままでも問題ありませんが、カスタムインストールを行う場合は適宜選択を変えてください。

ターミナル上に Rust is installed now. Great! と表示されればインストールは成功です。

この状態でシェルにリログインすると自動的にパスが通ります。すぐにパスを通して使いたい場合は、source コマンドを使い以下のようにすると自動的にパスを通してくれます。

# rustupが用意してくれているスクリプトを実行してパスを通す
source $HOME/.cargo/env

インストールが終わったら rustup のバージョンを確認してみます。パスが無事に通っていると cargo コマンドが使用できるようになっています。

以下のコマンドでバージョンを確認し、アップデートがあれば最新の状態にしておきます。

# rustupのバージョンを確認 (Vは大文字なので注意)
$ rustup -V

# rustupを最新にアップデート
$ rustup update

# rustup自体を最新にアップデート
$ rustup self update

パスが通るとパッケージ管理ツールの Cargo が使用できるようになり、Cargo 経由で exa を導入できます。

# exaのインストール
$ cargo install exa

Ubuntu などの環境によっては error: linker cc not found となり exa のビルドに失敗する場合があります。これは gcc とその依存関係がないことによるエラーのため apt install build-essential で必要なコンパイラをインストールした上で再試行してみてください。

exaを使ってみる

exa は ls コマンドと同じような感覚で使用できます。ターミナルで以下のように入力するだけでファイル名をカラフルに表示してくれます。

# exaを使用してファイルをリスト表示
$ exa

ls コマンドの代わりに exa を使用することで全体的に文字をカラフルに表示してくれるためターミナルが一気に華やかになります。

また exa はオプションがかなり多く、オプションを組み合わせて柔軟な表示ができのも魅力です。
exa に続けてオプションを指定するのですが、オプションが覚えきれないくらい多いので詳しくは公式の ReadMe を参考にしてみてください。

また私は ls コマンドに慣れていることもあり、同じように使用したいので私は exa コマンドに対してエイリアスを設定しています。

エイリアス設定でさらにexaを活用する

ls コマンドと同じように使えると聞いてピンときた人も多いのではないでしょうか。exa はエイリアスと組み合わせることで本領を発揮します。
前述したとおり exa はオプションがとても多く覚えて毎回入力するのは大変なので、ls コマンドに対してエイリアスを設定することで ls コマンドと同じような感覚で使用できるようになります。

私は ls コマンドと同じような使い方を保ちながら exa の恩恵を受けるために以下のようなエイリアスを設定しています。

.zshrc
if [[ $(command -v exa) ]]; then
  alias e='exa --icons --git'
  alias l=e
  alias ls=e
  alias ea='exa -a --icons --git'
  alias la=ea
  alias ee='exa -aahl --icons --git'
  alias ll=ee
  alias et='exa -T -L 3 -a -I "node_modules|.git|.cache" --icons'
  alias lt=et
  alias eta='exa -T -a -I "node_modules|.git|.cache" --color=always --icons | less -r'
  alias lta=eta
  alias l='clear && ls'
fi

内容としては exa コマンドがインストールされている環境でのみ有効になるエイリアスとしています。

全体的に ells に対してベースに、ファイルの種類ごとにアイコンを表示するオプション --icons を付けてエイリアスになっています。オプション --git を付与することで Git のファイル管理ステータスもリストに反映してくれるようになります。

またコマンドに t を混ぜることでツリー表示できるようにしています。
exa でのファイルツリー表示でもアイコンを合わせて表示するためにオプションを組み合わせています。ここまでくるとオプションがかなり長くなってしまいます。

そこでエイリアスを活用することで ls コマンドの上位互換としての運用が簡単にできるようになりました。

エイリアスの設定例としてはこちらのサイトを参考にカスタマイズさせていだたきました。わかりやすい解説ありがとうございます。

https://tombomemo.com/exa-install-settings/

exa はオプションを組みわせることで柔軟なファイル表示ができるので、各々使いやすいようにエイリアスを作成してみてください。

おわりに

今回は、おしゃれなターミナルというテーマでターミナルとシェルのカスタマイズをしてみました。ターミナル環境をカスタマイズすることで気分転換にもなりターミナルを開くたびにモチベーションが高まるように感じます。また作業環境にこだわるという点で生産性が上がるのを体感することが出来ました。

Rust 製のツールを初めて使いましたが、互換性が高かったり、安全かつ高速だったりとメリットが多く更に調べて取り入れていきたいと感じました。この記事をきっかけに、モダンな技術で柔軟にカスタマイズできるターミナルを簡単に構築できることに少しでも魅力を感じてもらえたら幸いです。

最後まで読んでいただきありがとうございました。

参考