blog.tkeo.info

fish shellに移行した

学生の頃にzshを使い始めてかれこれ10年以上になるが、2ヶ月ほど前にfishに移行した。 ようやく慣れてきたのでメモを残しておく。

使用しているfishのバージョンは2.4.0で、プラグインなどは入れてない。 oh-my-fishを使うと便利っぽいけど、困ったときに入れたらいいかなと思ってまだ困ってないので使ってない。

config

とりあえず~/.zshrcをベースに~/.config/fish/config.fishを作った。 aliasとかexportとかは大体そのままコピペで動くが、なぜかPATHのexportだけはうまくいかなかったのでsetを使うように変更した。

他はifendで閉じるとか、&&のかわりに; andを使うとか、$( )( )にするとか、気をつけないといけないポイントはいくつかあるけどそのへんは適当に。

補完

サーバーにログインするときはsshrcを使っていて、sshコマンドと同じようにタブでホスト名を補完してほしい。そういうときの設定は以下。

1
complete -c sshrc -w ssh

complete - edit command specific tab-completions

一時的な環境変数

例えばzshの場合だとこんな感じのコマンドを実行することがあるけど

1
RAILS_ENV=test rake db:reset

fishだとこれではダメで、envをつける必要がある。

1
env RAILS_ENV=test rake db:reset

How do I set an environment variable for just one command?

ブレース展開

{ }の中身が展開されるため、展開を抑制したいときはエスケープが必要。

1
git stash drop stash@\{1\}

とか、

1
rails g model foo bar:references\{polymorphic\}

とか。ちょっと面倒。gitの引数の場合はタブ補完でバックスラッシュをちゃんとつけてくれる。

プロセス置換

コマンド実行結果をファイルのように扱うやつ。zshだとこんな感じ。

1
diff <(foo) <(bar)

fishの場合はpsubを使う。

1
diff (foo | psub) (bar | psub)

psub - perform process substitution

履歴

zshのshare_history相当のものが無いため最初は戸惑ったが、普段使っているコマンドのパターンはそれほど多くなかったので履歴が育てば不要だった。

それでもtmuxの別のwindow/paneで少し前に打ったコマンドがほしくなることはたまにあって、そういうときはhistory mergeを実行して履歴を再読込している。

自動でmergeするのを試してみたけどコマンド実行のたびに微妙に待たされてストレスたまるので手動運用のほうがよいと思う。

history - Show and manipulate command history