fish shell

[2019/01/17 追記]

記事内で紹介している fish のパッケージマネージャの Fisherman が 2018/10/05 にメジャーアップデートしており、 fisher installfisher add に変わる等、大幅に変更されています(コメント欄参照)。プロダクト名も Fisherman から Fisher へ変わっています。

記事内で fisher install としている箇所は適宜読み替えて下さい。 🙏


今まで zsh をつかっていたのですがなんとなく fish に移行してみました。

雑な印象

zsh や bash では少しいじらないと入力中のコマンドのサジェスチョンなどをやってくれませんが、 fish の場合はその辺をカスタマイズなしにやってくれる感じです。

あとプロンプトの設定や関数の定義を GUI からできたり( fish_config コマンドの実行で Web ブラウザが立ち上がる)、ユーザーフレンドリーさに力を入れている。

なんとなくモダンな雰囲気。

fish をインストール

Mac だと以下。

brew install fish

ログインシェルにしようね^^。

sudo fish -c "echo '/usr/local/bin/fish' >> /etc/shells"
chsh -s /usr/local/bin/fish

見た目をいい感じにする

デフォルトのプロンプトでもまあ良いですが、せっかくなのでいじってみます。といっても fish らしくお手軽に済ませたい。

そこで fish のパッケージマネージャである fisherman を使ってみます。こいつでテーマとかプラグインを入れて楽しちゃえます。

パッケージマネージャは他には oh-my-zsh の fish 版である oh-my-fish があるのですが、 fisherman のほうが新しいぽいから fisherman を選びました。深い理由はない。

oh-my-fish と互換性があるので、 oh-my-fish 向けのプラグインやテーマを使うことができます。

fisherman をインストールします。

curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman

fisherman を使ってテーマをインストールします。以下のように oh-my-fish のものを使うことができます。

fisher install oh-my-fish/theme-bobthefish

一瞬でインストールされ見た目も変更された!

他のテーマは以下のページから探すことができます。見た目の画像つきで親切!

表示が化けてしまった場合は対応するフォントを入れてあげれば解消します。私は nerd-fonts を使っています。

nerd-fonts は以下で入ります。入ったらターミナルの設定で nerd-fonts を使うようにすれば OK です。

brew tap caskroom/fonts
brew cask install font-hack-nerd-font

さて、 bobthefish が入りました。 bobthefish は、以下のコマンドを実行することでカラースキーマを確認することができます。

__bobthefish_display_colors

カラースキーマをセットして __bobthefish_display_colors を実行することで、色々試すことができます。楽しい。

set theme_color_scheme zenburn
__bobthefish_display_colors

カラースキーマの一覧は以下から見れます。

気に入ったカラーテーマを見つけたら設定ファイルに記述して永続化します。私は gruvbox が気に入りました。 config.fish を作成しテーマを設定します。

vim .config/fish/conf.d/config.fish

以下を追記します。これで見た目をいい感じにする作業は完了。

set -g theme_color_scheme gruvbox

クセ

なんというかクセみたいなの。

  • 標準エラー出力は ^ でリダイレクトできる
  • NAME=hoge は動かない。 set NAME hoge とする
  • 終了ステータスは $? ではなく $status で見る
  • export コマンドが無い。環境変数は set --export NAME hoge のようにセットする
  • コマンド置換は () で行なう
    • 例) touch hoge.txt.$(date +%Y%m%d) ではなく touch hoge.txt.(date +%Y%m%d)
  • &&|| が無い
    • echo hello; and echo world のように書く

とか色々あります。割りと根底の部分で bash や zsh と互換がないので慣れないうちは戸惑いそうw

オートロード関数

fish は( bash や zsh と似たように)起動時に ~/.config/fish/config.fish を実行するので、 config.fish に便利関数を設定していくことができますが、オートロード関数というものがあり、基本的にはこちらを使用するのが推奨されているようです。

オートロード関数は動作中の fish シェル内で自動的に有効になるので便利ぽい。あと、オートロード関数は必要に応じて自動で読み込まれるようになっているらしいので、 fish の起動時間短縮やメモリ消費量を抑える効果もあるとのこと。

分かりやすいユースケースの例としては、プロンプトの設定をオートロード関数に書き出すとか。

ユニバーサル変数

fish には 全ての fish インスタンス間、さらには OS 再起動後ですら保持される変数があって、ユニバーサル変数という。

set -U EDITOR vim などとすると全ての fish 、 OS 再起動後も保持される。

けどこれやるとデフォルトでセットされた変数なのか自分でセットしたユニバーサル変数なのかわからなくなりそうw

使い所はありそうだけど注意しないと再現性のない fish になってしまいそう。

まとめ

fish への移行と fish tutorial の気になったところだけ読んだ。

fish 面白いのでこれからも使っていこう。 zsh 時代の遺産とかはこれから少しずつ移行していこうと思います。

あと fish の公式マニュアルを日本語化しているすごいサイトがあったので読む。