fish に移行した感想

今まで zsh を使っていたけど、突然移行したくなったので fish に移行した。移行には1日ほどかかって、思ったよりすんなり移行できたので感想をまとめる。移行手順とかは対象外。

良いところ

script が書きやすい

POSIX は なぜ if .. fi になってしまったのか。fish は圧倒的に直感的だった。
fish のスクリプトを書く上で気に入っていたのが、イベントへのハンドラが書きやすいこと。
function:【中核】イベントハンドラも別名も関数定義! にまとまっているけど、スクリプト実行直前に関数を実行などが簡単に定義できるので、tmux などで window タイトルの制御が簡単にできる。zsh でも当然できる(と思う)けど、あまり調べる気も起きなかった。
シェルでコマンドの実行前後をフックする - Hibariya 調べたところ、fish ほど簡単ではなさそう。

環境変数は別ファイルで設定

環境変数は set -U でプロンプトから直接永続的に定義できて、fish_variables ファイルにまとまっている。この fish_variables ファイルにまとまっているのが個人的に嬉しくて、zsh とかだと下手に export $PATH=/hoge:$PATH とかすると、再読込(source .zshrc)するたびにPATHが長くなっていく。もちろん zsh でも回避方法はあるけど、fish のほうがずっとスマートに感じる。

plugin manager が使いやすい

自分が oh-my-zsh などをちゃんと使いこなせなかったのが悪いけど、あまり良くわからんかった。それに比べれば全然わかりやすい。使いやすい。
良いプラグインがあるかどうかは、よくわからない。けど、試すのは楽。

悪いところ

fish 未対応なライブラリなどがある

コマンドの補完など、fish は対応してない場合がある。例えば kubernetes の kubectl は bash, zsh の補完は用意されているけど fish は未対応だった(issueはあるのでそのうち追加されると思う)。
対応してない場合は、今の所諦めて待つ。

fish 関係のバグ?に遭遇する

zsh でできたけど fish で動かなかったのは今の所2点

  • tmux + fish で window-status-current-format が設定できない

どうも pwd が tmux を実行した path を返すみたいで、pwd したり #{pane_current_path} を使っても現在のディレクトリが取れない。

  • tmux + direnv で日本語が export できない

fish + direnv を使ってると export HOGE="ほげ" のようにすると以下のようなエラーが出る

from sourcing file -
called on line 61 of file /usr/local/Cellar/fish/3.0.0/share/fish/functions/eval.fish

in function 'eval'
called on line 6 of file ~/.config/fish/conf.d/plugin-direnv_init.fish

in function '__direnv_export_eval'
called on line 5 of file /usr/local/Cellar/fish/3.0.0/share/fish/functions/cd.fish
with parameter list 'VARIABLE SET PWD'

in event handler: handler for variable 'PWD'

他にも、direnv allow としてもなんか動かなかったり、ちょっと挙動が変。
fish の設計に依存する問題だったら、この先も悩むかもしれない。

全体として

全く問題ないわけじゃないけど、今の所解決できないわけでもないので満足している。なにより、zsh は正直よくわからんけど fish のほうが調べる気力が出るのが違う。楽しさがあるので、基本 fish にしようと思う。