fish shell を使うべき理由と、おすすめの設定・プラグイン
fish shell を使うべき理由と、おすすめの設定・プラグイン
多くのユーザーは bash や zsh を使っていると思います。 ですが、私は 10 年以上前から fish shell をメインのシェルとして使っています。 理由はシンプルで、「インストールした瞬間から最高のシェル体験が得られる」 からです。
この記事では、2024 年にリリースされた fish 4.0 の変更点を踏まえたうえで、zsh と比較した fish shell のメリット、そして自分が実際に使っている Fisher プラグインや設定を紹介します。
なぜ zsh ではなく fish なのか
設定なしで「使える」シェル
zsh を快適に使おうとすると、まず Oh My Zsh や Prezto などのフレームワークを入れ、そこからプラグインを選び、.zshrc を育てていく必要があります。
シンタックスハイライトや自動補完を使うには zsh-syntax-highlighting や zsh-autosuggestions を追加でインストールしなければなりません。
fish はこれらの機能が すべてデフォルトで組み込まれています。 インストールした瞬間から、以下が何も設定しなくても動きます。
- シンタックスハイライト: コマンドが正しければ青、存在しないコマンドは赤で表示される
- オートサジェスション: 入力中にヒストリーや補完候補が灰色で表示され、
→キーで確定できる - タブ補完: コマンドのフ ラグやサブコマンドに対して、説明文付きの補完候補が表示される
zsh では「まず設定を整えてから使い始める」のに対し、fish は 「入れた瞬間から最高の状態」 です。
エラーメッセージがわかりやすい
zsh でスクリプトを書いたときに、エラーメッセージが不親切で原因の特定に時間がかかった経験がある方も多いと思います。fish はエラーメッセージが具体的で、何が悪いのか・どう直せばいいのかを明確に教えてくれます。
例えば、存在しないコマンドを実行しようとした場合でも、fish は類似コマンドの候補をサジェストしてくれます。
Web ベースの設定画面
fish_config コマンドを実行すると、ブラウザで設定画面が開きます。プロンプトのテーマ、カラースキーム、関数の一覧、変数の確認などが GUI で行えます。
fish_config
ターミナルの設定ファイルを直接編集するのが苦手な方でも、視覚的にカスタマイズできるのは大きなメリットです。
POSIX 非準拠は実はメリット
「fish は POSIX 非準拠だから...」という理由で敬遠する方もいますが、日常のインタラクティブ操作で POSIX 準拠が必要になる場面はほとんどありません。
シェルスクリプトを書く場合は #!/bin/bash や #!/bin/sh を使えばよく、ログインシェルとスクリプト用シェルは違っていても問題ありません。
むしろ POSIX の制約を捨てたことで、fish はよりモダンで直感的な構文を採用できています。
例えば、&& の代わりに and、|| の代わりに or といった書き方ができ(もちろん && と || も使えます)、変数のスコープも -g(グローバル)、-l(ローカル)、-x(エクスポート)と明示的に指定できます。
fish 4.0: Rust への書き換え
2024 年末にリリースされた fish 4.0 は、長年 C++ で書かれていたコードベースが Rust で完全に書き換え られました。 これにより、以下の恩恵があります。
- パフォーマンスの向上: 起動時間やコマンド実行のレスポンスが改善されました。特に大量のヒストリーを持つ環境での検索が高速になっています
- メモリ安全性: Rust のメモリ安全性の恩恵により、セグメンテーションフォルトやメモリリークのリスクが大幅に低減しました
- 今後の開発の加速: Rust エコシステムの充実したツールチェーン(Cargo、clippy、テストフレームワーク)により、コントリビューションの敷居が下がり、開発速度の向上が期待されます
ユーザー側で意識する必要はほとんどありませんが、「シェルがクラッシュする」という不安が減るのは精神的にも大きいです。シェルは開発のすべての起点になるツールなので、その安定性が向上したことは非常にポジティブです。
Fisher: fish のプラグインマネージャー
fish のプラグイン管理には Fisher を使っています。Fisher 自体もプラグインとして管理されるシンプルな設計で、fish_plugins というファイルにプラグイン一覧を書いておくだけでインストール・更新ができます。
# Fisher のインストール
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
おすすめプラグイン
自分が実際に使っているプラグインは以下の通りです。
jethrokuan/fzf
fish 上で fzf(ファジーファインダー)を快適に使うためのプラグインです。以下のキーバインドが追加されます。
Ctrl+R: コマンドヒストリーのファジー検索Ctrl+O: ファイルのファジー検索Ctrl+Alt+F: fzf でファイルを検索してコマンドラインに挿入
zsh で fzf を使う場合はキーバインド設定を自分で .zshrc に追加する必要がありますが、このプラグインを入れるだけですぐ使えます。
fisher install jethrokuan/fzf
jethrokuan/z
よく移動するディレクトリを学習して、部分一致でジャンプできるプラグインです。例えば z port と打つだけで、以前 cd したことのある /Users/mzk/Works/src/github.com/msageha/portfolio に飛べます。
zsh の z コマンドと同様の機能ですが、fish のオートサジェスションと組み合わさることで、 補完候補が表示されるのがさらに便利です。
fisher install jethrokuan/z
0rax/fish-bd
現在いるディレクトリのパスの中から、親ディレクトリ名を指定して一気に上に移動できるプラグインです。
例えば、/Users/mzk/Works/src/github.com/msageha/portfolio/content/blog にいるときに bd Works と打つと /Users/mzk/Works に一発で移動できます。cd ../../../../../../ のような入力から解放されます。
fisher install 0rax/fish-bd
decors/fish-ghq
ghq で管理しているリポジトリを fzf で検索して移動できるプラグインです。Ctrl+G でリポジトリの一覧が fzf で表示され、選択するとそのディレクトリに cd します。
Git リポジトリを大量に扱う開発者には必須のプラグインです。
fisher install decors/fish-ghq
dracula/fish
Dracula カラーテーマを fish に適用するプラグインです。ターミナルエミュレータや各種ツールのテーマと揃えると統一感が出ます。
fisher install dracula/fish
oh-my-fish/plugin-peco
peco を fish で使うためのプラグインです。fzf と似たインタラクティブフィルタリングツールで、用途に応じて使い分けています。
fisher install oh-my-fish/plugin-peco