Panda Noir

JavaScript の限界を究めるブログです。

zshからfishへ移行してみた

といってもまだ軽く偵察しただけなので、完全に移行するのはもう少し先になりそうですが。

2017/11/11 追記:

完全に移行しました。設定ファイルを移行しきれたのかはよくわかりませんが、不満なく使えています。

動機

zshをカスタマイズする愉しみをつい3日ほど前に覚えてカスタマイズしまくったのですが、なぜかvimの動作が重くなってしまいました。zsh自体は起動速度も動作速度も遅くないのですがね…

そこでこれを機に、以前より気になっていたfishを試してみようと思った次第です。

移行時につまづいたところ

どこに設定を書くのか分からない

そもそも設定ファイルの場所が大きく異なります。.zshrcや.zprofileのように.fishrc、.fishprofileなのかと思っていました。しかし、実際は全く違っていて~/.config/fish/config.fishという1つのファイルに設定を書きます。

.zshrcと.zprofileをまとめてconfig.fishへ入れればいいので管理が楽になります。ただし、スクリプトの書き方がbashやzshと異なり、そのままコピペしても動きません。

fiやesacをendにする

ifを閉じるのにbashやzshではfiを使っていましたが、fishではendと書きます。シンプルでわかりやすいです。

特に、caseをesacではなくendで閉じれるのは嬉しいですよね。

また、elifもelse ifと書き直します。これもプログラマにとってありがたいです。

変数の宣言がことなる

bashやzshでは HOGE=fugaとしていました。これがset HOGE fugaになります。

export HOGEset -x HOGE $ HOGEとなります。これは微妙な改変ですね。

元のコマンド呼び出しについて

Vimmerなので、次のようなエイリアスを設定していました。

alias vi="\vim"
alias vim="VIM=/usr/share/nvim nvim"

viでデフォルトのVimを、vimでNeoVimを起動するためのエイリアスです。これをfishに変換するときにつまづきました。

まず、元のコマンドを呼び出す方法が異なりました。fishではバックスラッシュをつけるのではなく、command vimと書きます。どう検索していいかわからず時間がかかりました。

次に、環境変数を一時的に変更する方法も異なりました。fishではenv VIM=/usr/share/nvim nvimとenvコマンドを使わなければなりません。

つまりこうなります。

alias vi="command vim"
alias vim="env VIM=/usr/share/nvim nvim"

デフォルトでONになっているオプション

zshでは手動で有効にしなければならないオプションも、fishではデフォルトで有効になっている場合が多いです。

例えば僕は次のオプションを有効にしていました。

setopt auto_cd
setopt hist_ignore_dups

これはfishではデフォルトで有効なようです。

プラグイン

zshに入れていたプラグインのうち、fish-likeとなっているものは当たり前ですが入れる必要がありません。例えばzsh-autosuggestionszsh-syntax-highlightingが該当します(というか僕自身がzshをカスタマイズし始めてまだ日が浅すぎるのでこれくらいしか入れてませんでしたが)。これらのfish-likeプラグインより本家の方が動作が直感的で気持ちいいです。

また、zsh-autosuggestionszsh-syntax-highlightingはうまく連携がとれていません(右キーを押して補完した際にシンタックスハイライトがうまく効かないなど)が、fishの場合は組み込み機能のため、ふたつがうまく接続されていて気持ちいいです。このあたりもfishのメリットですね。

総括

全体的にいい感じです。しかし、zshと比較すると情報が少なすぎてうまく使いこなせてる感じがしません。しかし裏を返せばzshみたいにゴリゴリ設定せずとも使える、ともとれるかもしれません。しばらく使ってみて様子を見ようと思います。

参考サイト

fish shellチュートリアル fish2.4日本語ドキュメント:すぐ使える25の便利機能と実例

2017/11/15 追記:

vim config.fishとしようとしてvim configまで入力しTABを押すとvim __fish_config_interactive_done=という補完が行われてしまいます。わりと致命的な気がします。そのほかにも、TAB補完の際にファイルが候補に出てこないというのが頻発していてストレスがマッハです。ちょっと残念ですね。