こんにちは, またくです。

fish を使い始めました。別に普段使っていた zsh に困っていたわけでもなんでもなく, 大学の研究室で何も分からず tcsh を使っていた僕にとっては, 便利極まりないものであります。

とはいえ, 21世紀に生まれたシェルということで, 後から出てくるのに前にあるものより悪いものは出てこないだろうという思いと, 普段よく触るようなところなので新しいものを入れるスタイルでありたいという思いから, 今に至ります。

Installing fish

Homebrew でインストールしました。

$ brew install fish

config.fish

$HOME/.config/fish/config.fish.zshrc のような設定ファイルになります。 .zshrc をそのまま使えたりはしないので, zsh に依存している処理をばっさり消して, チュートリアル を読みながら, せっせと移植していきました。とはいっても, 環境変数や alias くらいしかないので, 移行にはやる気があれば十分だった規模でした。

環境変数とか alias とかで埋め尽くされるのがあれだったので, 以下のような aliases.fish, env.fish を ~/.config/fish/ 以下に作成し, config.fish 内で読み込むようにしました.

# aliases.fish
alias a atom
alias g git
alias e 'emacsclient -nw'
alias grep ggrep
alias sed gsed

# env.fish
set -x HOMEBREW_CASK_OPTS “–appdir=/Applications –caskroom=/usr/local/Caskroom”
set -x PATH $HOME/.nodebrew/current/bin $PATH
set -x PATH /usr/local/bin $PATH
set -x JAVA_HOME (/usr/libexec/java_home -v 1.8)
set -x PATH $HOME/.cargo/bin $PATH
set -x PATH $HOME/Library/Android/sdk/tools $PATH

# config.fish
. ~/.config/fish/aliases.fish
. ~/.config/fish/env.fish

functions

fish では $HOME/.config/fish/functions/ 以下をオートロードしてくれるので, ここで色々自作の関数を定義しておくと良さそうですが, 簡単なやつは alias の方に書いてしまいました。

ただ, 便利なプラグインがたくさんあるので, それらを導入するのも良さそうです。peco 用の history プラグインは速攻で入れました。プラグインは fisherman に管理してもらっています。

prompt

fish_prompt 関数によって, プロンプトの設定ができました。

# fish_prompt.fish
function fish_prompt
  set_color FD8724
  echo -n ‘[$] ‘
  set_color normal
end

右側に何か表示したいという場合は, fish_right_prompt 関数を定義します。僕は git のブランチ名やカレントディレクトリの表示は tmux のステータスラインに出しているので, 上のようなプロンプトで生きています。

その他

コマンド実行時のローカル変数の格納を以下のようにやると, 定義されませんでした。

$ FOO=bar ruby out.rb
Unsupported use of ‘=’. To run ‘ruby’ with a modified environment, please use ‘env FOO=bar ruby…’

メッセージにも書かれていますが, 一応ドキュメントも見ると, env か begin-end のブロック処理を使って, 変数を定義できるっぽいので,

$ env FOO=bar ruby out.rb
で良かったです。一応 p ENV['FOO'] とかで値出力して, 定義された値が入っているのを確認したり, その後 echo $FOO とかやっても一時変数なので定義されていない値になる, といったことを確認してしまいました。

現時点で fish の設定ファイルはこちらですが, これからすくすく育てていくことになりそうです。補完が強いのは色々と楽だな〜という思いです。