デザインでブランディングのお手伝い
デザインでブランディングのお手伝い
2019.04.26

「うん、このシェルいいね」5年間使ってきたzshからfishにのりかえました

TK

こんにちは、バックエンドエンジニアのTKです。

これまで、開発マシンのデフォルトシェルとして約5年ほどzshを使っていました。いろんなプラグインを追加したりプロンプトをカスタマイズしたりしていて、それなりに愛着も湧いていました。

立ち上がりに少し時間がかかっていたくらいで特に大きな不満もなかったのですが、新年度ということで心機一転しようと思いたちfishにのりかえたので、いろいろと書いていこうと思います。

ちなみに、fishは数年前に話題になっていたとき、ほんの一瞬だけ触ってみたことがありました。
しかし、そのときはのりかえることを考えて触ったわけでもなかったので「これならカスタマイズ済のzshのままでいいや」と判断しそれ以来立ち上げることもありませんでした。それでも、zsh以外だったらfish一択だなと考えていたので、今回シェルに選ぶにあたり特に悩むことなく決めました。

fishのここがいい

fishについてはいろんなところで紹介されているのですが、担当編集がうるさいので実際にのりかえてみてボクが感じたいいところを書いておきます。

補完が優秀

zshも他のシェルに比べると補完が優秀で、さらにプラグインを追加すると補完で困るようなことはありませんでした。

しかし、fishはデフォルトの状態でも強力な補完を提供してくれます。実際使ってみると本当にすごいです。

入力内容のシンタックスハイライト

zshでもプラグインを追加することで入力内容をリアルタイムでシンタックスハイライトすることができるのですが、fishにはこれがデフォルトで実装されています。

zshでシンタックスハイライトを有効にしていた時は微妙なラグが気になって外したりしていたのですが、fishのシンタックスハイライトはほとんどラグも発生せずとても実用的です。

fishのシンタックスハイライト

設定が簡単

後述するプロンプトのカスタマイズでも触れていますが、configが書きやすく、さらにfish_configを実行するとブラウザ上で主要な設定変更をすることができます。

さらに変更項目にもよりますが、sourceコマンドでconfigの再読込などをしなくても変更が反映されるため、プロンプトのカスタマイズなどが捗ります。

fish_config

プロンプトをカスタマイズする

設定が簡単

とりあえず、いままでと同じプロンプトを表示させたいと思いfish用に書き換えたのですが、zshに比べると設定がとても書きやすかったです。

ver. zsh

promptの設定ver.zsh

PROMPT="%(?.%{$fg<pre>[code]%}.%{$fg<pre>[code]%})%(?!(%{$fg[magenta]%}๑ %{$fg[white]%}°口°%{$fg[magenta]%}๑%{$fg<pre>[code]%}%)!(๑ °口°๑%))%{${reset_color}%} { "

ver. fish

promptの設定ver.fish

function fish_prompt
  if [ $status -eq 0 ]
    set status_face (set_color green)'('(set_color red)'๑'(set_color white)' °口°'(set_color red)'๑'(set_color green)')' (set_color white)'{ '
  else
    set status_face (set_color blue)'<(;'(set_color white)' °A°'(set_color blue)')> ' (set_color white)'{ '
  end

  echo $status_face
end

絵文字にしてみた

絵文字にしてみた

function fish_prompt
  echo \U1F4A9 ' { '
end

うん、これはzshでもできますね。

右プロンプトにも置いてみた

function fish_prompt
  echo \U1F4A9 ' { '
end

function fish_right_prompt
  set_color green
  date +"%H:%M"
  echo (set_color white)' }' \U1F4A9'  '
end

うん、これもzshでもできますね。

プロンプトを複数行AAにしてみた

プロンプトを複数行AAにしてみた

function fish_prompt
  set unk (set_color a77405)'   _人\n  (  )\n  ('(set_color white)'へ ノ'(set_color a77405)')\nヽ( '(set_color white)'´ 」`'(set_color a77405)')ノ\n (  '(set_color white)'`ー'(set_color a77405)' )'(set_color white)' { '
  echo -e $unk
end

うーん、これはfishならでは!

fishのプロンプトは複数で設定することが可能なので、こんなAAを設定することもできます。

また、色指定をset_color a77405のようにhexでできるのもWebエンジニアには馴染み深いのでわかりやすくていいですね。ちなみに右プロンプトは複数行に対応していないようです。

プロンプトに画像を表示してみる

うん、ここまで設定して、「echoで出力しているということは他のコマンドの実行結果を表示することもできるんじゃないか」と気付きました。

そして、「もしかしたらimgcatで画像表示できるんじゃないかしら?」とも思いついてしまったのです。

……ということで、試してみました。

プロンプトに画像を表示してみる

function fish_prompt
  set prompt (set_color green)(prompt_pwd)
  imgcat $HOME/Desktop/unk.png;
  echo (set_color blue) $prompt (set_color green)' > '
end

うん、これもばっちり表示できました。せっかくなので弊社CTOを表示してみましょう。

CTO CLI

ついでにiTerm2の背景画像も変更してみました。これが……CTO CLIだ!

うーん、これはご利益のありそうなターミナルになりましたね。運気も上昇していい仕事ができそうですし、給料もあがりそうな予感がします!

※予感がするだけです。

まとめ

とういうことで今回は(典型的なミーハーエンジニアっぽくてアレですが……)、とうとう私もzshからfishにのりかえてしまいました、という話でした。