Bash to the Fisher

かれこれ長いこと仕事でターミナルを使ってるこもりですが、シェルでゴリゴリなんかするでもないし、多機能すぎて覚えるのが面倒くさいのも嫌なのでずっとBashを使っていました。カスタマイズすることもなく、ほぼデフォルトで。

Fish

でも、長いこと使っていたそのBashから、最近「Fish(friendly interactive shell)」というシェルに変えたんです。特に思い入れがあるわけでもなければ、そんなゴリゴリ使うわけじゃないから何でも良いのです、簡単であれば(笑)。

初期設定いらずの楽さ

使い始める前に細かい設定とかはできればしたくない…。インストールしただけで簡単・便利に使えるのが理想。カスタマイズしたければすればいいのだけど、あいにくそこまでやる必要は自分にはないのでFishぐらいがちょうど良い、と。

Fishの楽なところを挙げてみると…。

  • インストールしただけで強力な補完機能が使える
  • コマンドの有無が色分けされるのでわかりやすい
  • cdとかいらない(なくてもディレクトリ名で移動)
  • 大文字小文字も適切に変換して補完する
  • prevdnextdでディレクトリの履歴を移動
  • 途中まで入力して合致するものだけ履歴を辿れる
  • sudoとかsshのようなコマンドの後でもタブ補完
  • man lsとかコマンドに続けてタブで説明を表示
  • コマンドの後に「-」つけてオプションの表示
  • ブラウザからプロンプトの種類とか設定変更が可能
  • その気になればプラグインとかで機能追加できる

といった感じで、「コマンドとか覚えられない…」みたいな人には親切きわまりない仕様。とりあえず、タブキーと矢印キー押してればなんとかなる感じなんですよね。なんかもう戻れません(笑)。

Fishのインストール

一応公式のインストーラーもありますが、OS XならHomebrewで入れた方が簡単。

$ brew update;
$ brew install fish
$ which fish

/usr/local/bin/fish

で、fishの場所が出たらOK。

ターミナルを立ち上げたときに起動するログインシェルが「Bashのままでいいや」って人は、fish使いたいときだけ「fish」を実行すれば切り替えることができます。もう「ログインシェルから変える」という方は、以下の手順で「/etc/shells」にFishのパスを追加してシェルを切り替えてしまいましょう。

ログインシェルの変更

$ echo "/usr/local/bin/fish" | sudo tee -a /etc/shells

これで「/etc/shells」にFishのパス(/usr/local/bin/fish)が追加されます。

$ cat /etc/shells

/etc/shells

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/fish

追加されない人は、sudo付けて「/etc/shells」を直接編集しましょう。

$ sudo vi /etc/shells

追加されたら以下のコマンドでログインシェルをFishに変更できます。コマンドを実行したら一度ターミナルのウィンドウを閉じて、新規ウィンドウを開けばFishが起動するでしょう。

$ chsh -s /usr/local/bin/fish

またBashに戻したかったら以下で。

$ chsh -s /bin/bash

Fishの設定変更

Fishは「fish_config」コマンドを実行して、ターミナルの配色であったりプロンプトの書式を変えたりすることができます(Gitのブランチを表示するのにしたり)。

$ fish_config

すると、ブラウザが起動して設定画面が表示されます。プロンプトを変えるのであれば、「prompt」タブから好みのものを選んで右側に出る「use prompt」を選んでブラウザウィンドウを閉じましょう。で、ターミナルに戻ったら「enter」キーで終了します。

また、Fishの設定ファイルは「~/.config/fish/config.fish」です。

config.fishがなければ作りますが、テーマやプラグインがまとまった「oh-my-fish」を追加しておくと、あとあと機能追加もできて良いでしょう。インストールすれば、自動的にconfig.fishが作成されます。

$ curl -L https://github.com/bpinto/oh-my-fish/raw/master/tools/install.fish | fish

上記のコマンドでうまくいかない場合は、リンク先のGitHubのページにGitでクローンする方法が書いてあります(※既にconfig.fishがあるとインストールできないので、一度移動するなり削除するなりしましょう)。

パスの追加

BashからFishに移行して何気に躓くのは、環境変数とかの書き方が違うというところでしょうか。何か動かすためにパスを追加したいのに、どうやって追加したらいいかがわからないという(exportとかないので)。変数は設定ファイルである「~/.config/fish/config.fish」に追加します。

set RBENV_ROOT $HOME/.rbenv  
set -g -x PATH /usr/local/bin /usr/local/sbin $PATH  
alias nano "nano -w"  

こんな感じで環境変数を追加するには「set」を使います。パスなんかはバラバラと個別に書いても良いですが、面倒くさかったら半角スペースで空けて列挙すれば大丈夫です。aliasは「nano="nano -w"」みたいに「=」で繋いでも動作します。

設定を変更したら一度再読み込みしましょう。

$ source ~/.config/fish/config.fish

補完のアップデート

あ、補完される内容は以下のコマンドでアップデートできます。新しくHomebrewとかでソフトを追加したときなんかに実行すると良いですかね。

$ fish_update_completions

補完の追加

HomebrewでインストールしたFishにはNodejs(+npm)の補完がまだ含まれていません。GitHubのリポジトリには既に以下の2つがあるので、「~/.config/fish/completions」ディレクトリを作って放り込めばOKです。

.config/fish/completions/
├── node.fish
└── npm.fish

こんな感じで。一度ターミナル立ち上げ直してみましょう。

以上、簡単で便利なFishの紹介でした。


追記: いっこ大事なこと書くの忘れてました。「&&」でコマンドを連続して実行させられないので、連続して実行したいコマンドがある場合は「;(セミコロン)」使いましょう。