shell を fish に変えてみた


はじめに

この記事は Sansanアドベントカレンダー 5日目です。

今日のお話

shell は、かれこれ 10 年くらい zsh を使っているのですが、今年の夏くらいに fish にしてみました。
3 ヶ月程で結局 zsh に戻ってしまったのですが(理由は後述)、今回は備忘録を兼ねてやってみたことをまとめてみようと思います。

oh-my-fish

いきなりですが oh-my-fish というのがあるので入れてみます。

こいつを入れると omf というコマンドが使え、プラグインを管理することができます。

omf install XXX でプラグインをインストールすることができます。テーマは omf theme YYY
また、omf list とするとインストールしたプラグインが確認できます。

私は以下のプラグインをインストールしてみました。

⋊> ~ omf list
Plugins
brew                omf
bundler             osx
fish-peco_select_ghq_repository pbcopy
fish-peco_select_zsh_history    peco
fish-spec           rbenv
gem

Themes
default yimmy

fish_config

あと面白いのは、以下のコマンドでブラウザが立ち上がりそこで設定とかができることです。

⋊> ~ fish_config

こんな画面で設定することができます。

Theme の変更や設定している function の確認など色々できます。

引っ掛かりポイント

bash や zsh と違って、例えば以下のように環境変数を与えてコマンドを実行する場合は env が必要です。

⋊> ~ env RAILS_ENV=test bin/rake db:create

設定

ここまで設定すれば他には特になにもしなくても十分使えましたが、CTRL-j を押したときに ls と git status を表示するようにしたかったので、それは以前 こちらの記事 にまとめています。

また bundle showpeco に食わせて bundle open できるようにしたかったので、以下の function を定義しました。

functions/peco_bundle_open.fish
function peco_bundle_open
  set -l query (commandline)

  if test -n $query
    set peco_flags --query "$query"
  end

  bundle show 2> /dev/null | sed -e '/^  \*/!d; s/^  \* \([^ ]*\) .*/\1/' | peco $peco_flags | read line

  if test -n $line
    echo $line
    commandline "bundle open $line"
  end
end

config.fish はこんな感じになりました。

config.fish
# Path to Oh My Fish install.
set -q XDG_DATA_HOME
  and set -gx OMF_PATH "$XDG_DATA_HOME/omf"
  or set -gx OMF_PATH "$HOME/.local/share/omf"

# Customize Oh My Fish configuration path.
set -gx OMF_CONFIG "$HOME/.config/omf"

# Load oh-my-fish configuration.
source $OMF_PATH/init.fish

set -Ux GOPATH $HOME/workspace/go

set -U fish_user_paths $fish_user_paths $GOPATH/bin

set -Ux LC_ALL ja_JP.UTF-8

set -Ux EDITOR 'emacsclient -n'

alias mv 'mv -i'
alias cp 'cp -i'
alias rm 'rm -i'

alias g git

eval (hub alias -s)

function fish_user_key_bindings
  bind \c] peco_select_ghq_repository
  bind \ct peco_select_zsh_history
  bind \cr peco_select_history
  bind \cj do_enter
  bind \co peco_bundle_open
end

使ってみて

3 ヶ月程使ってみたのですが、zsh だと SAVEHIST で履歴の件数が指定できたのですが、fish でどうやるかよくわからず zsh に戻ってしまいました

てな感じで結局使わなくなってしまったわけですが、fish は特に設定しなくても補完機能など強力な機能があり、乗り換えは結構すんなりできるんじゃないかと思いました