エンジニア人生の中で zsh を導入しようと数回思いたったことはあるのだけれど、毎回初期設定のひどさを見るたびに辟易して bash でいいやと諦めていた。
コピペで機能追加できるとか言われても、自分の理解の範疇を超えてわけわからん状態になるのは耐え難いし、そこに学習コストをかけるモチベーションもない。
しかし最近になって Fish Shell=fish という面倒がなく導入できて使い勝手もすこぶる良いものがあると知り導入することにした。
インストール
Homebrew でインストールできる。
$ brew install fish
プラグイン管理ツールのインストール
zsh では oh-my-zsh, Antigen, zplug のようないくつかのプラグイン管理ツールがあるようだけど、fish では oh-my-fish と fisherman があり、fisherman の方がより洗練されているそうなので fisherman を使うことにする。
$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman $ fisher -v fisherman version 2.9.0 ~/.config/fish/functions/fisher.fish
- fisher コマンドの使い方は
fisher -hをみる - プラグインは http://fisherman.sh/ から検索できる
- 導入したプラグイン
- rbenv -
rbenvの自動設定 - pyenv -
pyenvの自動設定 - fzf -
pecoより高機能な対話的フィルタリングツールのfzfの関数 - decors/fish-ghq -
Ctrl + Gでfzf&ghqの連携をしてくれる
- rbenv -
初期設定
デフォルトのシェルを bash から fish に変更する。
$ echo /usr/local/bin/fish | sudo tee -a /etc/shells $ chsh -s /usr/local/bin/fish
設定ファイル
bash では ~/.bash_profile や ~/.bashrc を設定ファイルとして使うが、fish では ~/.config/fish/config.fish を編集する。
$ touch ~/.config/fish/config.fish
現状、このような記述にしている。
nodebrew と golang のプラグインはまだないようだが、ちゃんと探せてないだけだと思う。
見た目の変更
ローカル環境でサーバが起動しWebブラウザから設定できるようになる。
$ fish_config
各種設定
bash のときは ruby, node.js, golang の設定を書いているくらいだった。fish では config.fish に書かなくても fisherman でインストールすれば使えるようになるものもある。
以下は Ruby 環境用の rbenv と Python 環境用の pyenv の自動設定プラグイン。
$ fisher add rbenv pyenv
最高に便利なプラグイン
対話的フィルタリングツールとして peco が有名だけど、同等以上に便利な fzf を Mac にインストールした。
$ brew fzf
続いて fish で便利に使えるようにする fzf プラグインをインストール。
$ fisher add jethrokuan/fzf
これでキーバインディグが追加される(ただし Mac の場合は Alt + c が ç と入力されてしまうため、Esc キーを使ったり別途設定が必要)。
Ctrl-t: カレントディレクトリ配下のすべてのファイルを自動補完Ctrl-r: コマンド履歴から自動補完Ctrl-x: コマンド履歴から自動補完して確認なしに即実行Alt-c: カレントディレクトリ配下のすべてのディレクトリを自動補完して移動Alt-Shift-c: カレントディレクトリ配下のすべてのディレクトリを自動補完して移動 (隠しファイル含む)
Go 言語を利用している場合は GitHub リポジトリの clone に ghq を利用している人が多いが、これも fish プラグインを使うことで便利なリポジトリ移動ができる。
fisher decors/fish-ghq
いろいろなオートコンプリートを追加
man ページを元に自動生成してくれる。git コマンドでも ruby コマンドでも何でも自動で追加してくれる。この仕組みはシェル界隈ではエポックメイキング的に便利な新機能のようだ。
生成ファイルは ~/.local/share/fish/generated_completions に保存された。
$ fish_update_completions Parsing man pages and writing completions to /Users/jnst/.local/share/fish/generated_completions/ 2683 / 2683 : zic.8