fish shell
[2019/01/17 追記]
記事内で紹介している fish のパッケージマネージャの Fisherman が 2018/10/05 にメジャーアップデートしており、 fisher install
が fisher add
に変わる等、大幅に変更されています(コメント欄参照)。プロダクト名も Fisherman から Fisher へ変わっています。
記事内で fisher install
としている箇所は適宜読み替えて下さい。 🙏
今まで zsh をつかっていたのですがなんとなく fish に移行してみました。
雑な印象
zsh や bash では少しいじらないと入力中のコマンドのサジェスチョンなどをやってくれませんが、 fish の場合はその辺をカスタマイズなしにやってくれる感じです。
あとプロンプトの設定や関数の定義を GUI からできたり( fish_config
コマンドの実行で Web ブラウザが立ち上がる)、ユーザーフレンドリーさに力を入れている。
なんとなくモダンな雰囲気。
fish をインストール
Mac だと以下。
brew install fish
ログインシェルにしようね^^。
sudo fish -c "echo '/usr/local/bin/fish' >> /etc/shells"
chsh -s /usr/local/bin/fish
見た目をいい感じにする
デフォルトのプロンプトでもまあ良いですが、せっかくなのでいじってみます。といっても fish らしくお手軽に済ませたい。
そこで fish のパッケージマネージャである fisherman を使ってみます。こいつでテーマとかプラグインを入れて楽しちゃえます。
パッケージマネージャは他には oh-my-zsh の fish 版である oh-my-fish があるのですが、 fisherman のほうが新しいぽいから fisherman を選びました。深い理由はない。
oh-my-fish と互換性があるので、 oh-my-fish 向けのプラグインやテーマを使うことができます。
fisherman をインストールします。
curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman
fisherman を使ってテーマをインストールします。以下のように oh-my-fish のものを使うことができます。
fisher install oh-my-fish/theme-bobthefish
一瞬でインストールされ見た目も変更された!
他のテーマは以下のページから探すことができます。見た目の画像つきで親切!
表示が化けてしまった場合は対応するフォントを入れてあげれば解消します。私は nerd-fonts を使っています。
nerd-fonts は以下で入ります。入ったらターミナルの設定で nerd-fonts を使うようにすれば OK です。
brew tap caskroom/fonts
brew cask install font-hack-nerd-font
さて、 bobthefish が入りました。 bobthefish は、以下のコマンドを実行することでカラースキーマを確認することができます。
__bobthefish_display_colors
カラースキーマをセットして __bobthefish_display_colors
を実行することで、色々試すことができます。楽しい。
set theme_color_scheme zenburn
__bobthefish_display_colors
カラースキーマの一覧は以下から見れます。
- GitHub - oh-my-fish/theme-bobthefish: A Powerline-style, Git-aware fish theme optimized for awesome.
気に入ったカラーテーマを見つけたら設定ファイルに記述して永続化します。私は gruvbox が気に入りました。 config.fish
を作成しテーマを設定します。
vim .config/fish/conf.d/config.fish
以下を追記します。これで見た目をいい感じにする作業は完了。
set -g theme_color_scheme gruvbox
クセ
なんというかクセみたいなの。
- 標準エラー出力は
^
でリダイレクトできる NAME=hoge
は動かない。set NAME hoge
とする- 終了ステータスは
$?
ではなく$status
で見る export
コマンドが無い。環境変数はset --export NAME hoge
のようにセットする- コマンド置換は
()
で行なう- 例)
touch hoge.txt.$(date +%Y%m%d)
ではなくtouch hoge.txt.(date +%Y%m%d)
- 例)
&&
や||
が無いecho hello; and echo world
のように書く
とか色々あります。割りと根底の部分で bash や zsh と互換がないので慣れないうちは戸惑いそうw
オートロード関数
fish は( bash や zsh と似たように)起動時に ~/.config/fish/config.fish
を実行するので、 config.fish に便利関数を設定していくことができますが、オートロード関数というものがあり、基本的にはこちらを使用するのが推奨されているようです。
オートロード関数は動作中の fish シェル内で自動的に有効になるので便利ぽい。あと、オートロード関数は必要に応じて自動で読み込まれるようになっているらしいので、 fish の起動時間短縮やメモリ消費量を抑える効果もあるとのこと。
分かりやすいユースケースの例としては、プロンプトの設定をオートロード関数に書き出すとか。
ユニバーサル変数
fish には 全ての fish インスタンス間、さらには OS 再起動後ですら保持される変数があって、ユニバーサル変数という。
set -U EDITOR vim
などとすると全ての fish 、 OS 再起動後も保持される。
けどこれやるとデフォルトでセットされた変数なのか自分でセットしたユニバーサル変数なのかわからなくなりそうw
使い所はありそうだけど注意しないと再現性のない fish になってしまいそう。
まとめ
fish への移行と fish tutorial の気になったところだけ読んだ。
fish 面白いのでこれからも使っていこう。 zsh 時代の遺産とかはこれから少しずつ移行していこうと思います。
あと fish の公式マニュアルを日本語化しているすごいサイトがあったので読む。