June 25, 2018

シェルを zsh から fish に乗り換えたらモノクロームだった日常がカラフルに色づきはじめた

Tl;dr

控えめに言って最高でした。

やったこと

Introduce fish by cheezenaan · Pull Request #5 · cheezenaan/dotfiles

コミットを追っていってください :pray:

Introduce fish

平成生まれの非 POSIX シェル。 Friendly Interactive SHell の略称らしい。

bashzsh とは異なり、オートコンプリートなどの便利機能が設定不要でいきなり使えることが大きな特徴。

fish shell

brew install fish

chsh -s でログインシェルにはせずにターミナル側でよしなに fish を呼び出してやる。 iTerm2 の場合は Preferences > General > Command から /usr/local/bin/fish を指定してやれば OK。

設定ファイル

$HOME/.config/fish/config.fish に記述する。ターミナル上から fish_config と入力すると Web ブラウザ上から fish の設定を変更できる。

confugration

fisherman でプラグイン管理

jorgebucaran/fisher: A package manager for the fish shell

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

zsh でいうところの zplug 的なやつ。使い勝手的には gem とか bundler っぽい。

  • fisher ls-remote でインストールできるプラグインの一覧を検索
  • fisher <plugin> でプラグインをインストール

fzf と ghq を fish でも使えるようにする

zplug 経由で ghq を導入できたが fisherman には対応するものがないので素直に homebrew からインスコする。

brew install ghq fzf

fish 上から fzf や ghq を操作するプラグインがあるのでよしなにインスコ。

fisher decors/fish-ghq fzf

自動補完

fish_update_completions

man コマンドから補完を自動生成してくれるらしい。なにこれやばい。

環境変数の定義

bash や zsh で export PATH=/usr/local/bin:$PATH としていたのを set -x PATH /usr/local/bin $PATH と変更していく。

環境変数の定義をしていくと、セッションを呼び出すたびに PATH がどんどん長くなる問題にぶち当たった。 set -x の使い方に問題があったので、 fish.config の末尾にこんなワンライナーを付け足して解消した。

# ./config/fish/config.fish

# Remove redundant paths
set -x PATH (echo $PATH | tr ' ' '\n' | sort -u)

スペース区切りで並んだ $PATH から sort -u で重複を削除している。

エイリアスの設定とか

zsh で使用していたエイリアス集を別ファイルから読み込ませた。alias foo='bar'alias foo 'bar' となっただけで瞬殺で移行できた。

tmux とのつなぎこみ

reattach-to-user-namespace で使用するシェルを fish に変更する。

# ~/.tmux.conf

# ...

set-option -g default-command "reattach-to-user-namespace -l $(which fish)"

ベンチマークしてみた

$ for i in (seq 1 5) ; time fish -ic exit ; end
        0.12 real         0.08 user         0.04 sys
        0.11 real         0.08 user         0.03 sys
        0.11 real         0.07 user         0.04 sys
        0.11 real         0.07 user         0.03 sys
        0.11 real         0.08 user         0.04 sys

な ん で す か 、 こ れ 。

今までの努力はなんだったのか。

所感

手持ちの設定ファイルの量にもよるけど、シュッとデフォルト設定のまま試してみてよさそうなら移行を考えてもいいのでは。自分の場合はそこまでがっつりカスタマイズして zsh 固有のなにかを使ってたわけでもないし、とりあえず ghqfzf が気持ちよく使えればよかったので、今回を機に fish へ移行してみて概ね満足している。

pros

  • zsh に比べて設定ファイルの記述量が圧倒的に少なくて済む
    • ゼロコンフィグの波をシェルにも感じる
  • しかも速い!!!!!
    • スピード is 大正義
  • 日本語のドキュメントが充実してるので割と安心

cons

  • シェルスクリプトの文法や環境変数の定義にひとクセある
  • fisherman を dotfiles で管理するベストプラクティスが知りたい

参考資料

fish 全般

rbenv まわり

プロンプトのカスタマイズ

環境変数とか

This site is generated by Gatsby, a blazing fast modern site generator for React.

© 2020. cheezenaan