Backlog開発チームの佐藤です。自宅と会社でWindows/Macを併用しているせいか、日本語と英語を切り替えるとき、自宅のWindowsではWindows+スペース、会社のMacではescキーをよく押してしまいます。
それはさておき、私がコンソールで操作するときはデフォルトで入ってるものをそのまま使います。Macデフォルトのbashのディレクトリ移動にいい加減疲れを感じたのと同時に、zshに憧れを抱いていました。そんな最中、「fish shell」というシェルを見つけて超快適になったので、その素晴らしさをお伝えします。
fishとは?
後ろがshとなっている通り、シェルの名前です。お魚じゃないよ!githubにてthe friendly interactive shellと自称しているだけあり、ユーザーフレンドリーさに重点を置いて開発されています。
fishの特徴として、他のシェルと比べると新しく(2005年リリース)、強力なサジェスチョン/補完機能、親切なシンタックスハイライト、GUI(ブラウザ)での設定/ヘルプページなどが”標準”で備わっていることが挙げられます。
インストール
インストールはすごく簡単です。Macでhomebrewを使用しているのなら
$ brew install fish
を実行するだけ。
Linuxですとディストリビューションのパッケージマネージャーからインストールすると、古いバージョンが入る場合があるので、公式が用意したリポジトリからインストールすることをオススメします。
Ubuntuならば公式のppaがありますのでそちらから。
$ sudo apt-add-repository ppa:fish-shell/release-2 $ sudo apt-get update $ sudo apt-get install fish
その他OSへのインストール(debian含む)はこちらのGo fishからどうぞ。
感動した機能
サジェスチョンと補完
では、まずはサジェスチョンと補完機能から試してみましょう。
ホームディレクトリから試しに/usr
ディレクトリに移動(cd)してみます。
上のスクリーンショットは、cd /uと打ち込んだ状態のシェルの様子です。
薄い字でsr/がサジェストされています。タブキーを押下しなくともサジェスチョンが教えてくれます。
では、途中まで同じフォルダ/ファイル名だった場合はどうでしょうか。この場合は、辞書順にソートし、その中で一番最初に来るものがサジェストされます。ですが、探したい名前はサジェストされたものである可能性は高くはないでしょう。
しかし、そんな時でもfishは親切な機能を提供してくれています。
今度は、/sと入力し、タブキーを2回押下させてみましょう。
gifの通り、/sで始まるディレクトリが一覧表示されています。ここまででしたらbashなどにもある普通の機能なのですが、gifを見るとお判りいただける通り、表示されたリストから直接選択することが可能です。
移動も、タブキーだけでなく矢印キーでも可能です。
リストを見て残りの文字を打ち込んでまたタブを押す、という不毛なことをやる必要はありません。
また、fishは、子フォルダを走査する{directory}/*/
のような指定もできますので、このようにも使えます。
これらのユーザーフレンドリーなサジェスチョンはパスに限られた機能ではありません。
タブキーを押下すれば、だいたい求めているものを補完してくれると思っても問題ないぐらいです。
しかし、難しい作業は必要ありません。
~> fish_update_completions
このコマンドを実行させるだけです。
シンタックスハイライト
シンタックスハイライトもデフォルトで付いてきます。
例えば、以下はclear
の綴りをtypoしたものです。clareというコマンドは存在しないので赤文字で警告してくれています。
これはコマンドだけでなく、ディレクトリパスでも同様です
/usr
のtypoを想定して/user
と入力しています。/user
というディレクトリは存在しないため、こちらも赤文字で警告しています。
設定とヘルプページ
help
と入力してみてください。ブラウザが立ち上がり、このようなページが表示されます。fishにはmanページの他、ブラウザ上で見れるヘルプページが用意されています。
ただ、正直私自身この機能はどうでも良いと思っています。内容は公式ページのドキュメントと同じものですから。 すごいと思っているのはこちらの機能です。こちらも同じくターミナルのfish上で、fish_config
と入力してみてください。
特にカラー設定とプロンプトは、実際に表示されるサンプルを見ながら設定することが可能ですのでとても快適です。
というより、カラー設定をコマンドラインで設定しようとすると、fishの環境変数に通常の文字の色やechoなどで表示させる時のクオート内の文字などを1つずつ設定する必要があります。
プロンプトも、functionと呼ばれる関数を作成し自分で定義する必要がありますので、やはりブラウザから設定することをオススメします。
プラグインマネージャ
node.jsに対するnpmのように、fishにはプラグイン管理マネージャーがあります。プラグインマネージャーはいくつかありますが、その中でもよく使われているのがfishermanです。
インストール方法は、
curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher
を実行するだけ。
とはいっても、fishがそもそも至れり尽くせりなのでプラグインを入れる必要性をあまり感じません。
強いていうならば、デフォルトで入ってないテーマで気に入ったものがあればインストールするぐらいでしょうか。
戸惑うところ
とても使いやすいfishですが、bash に慣れ親しんでいると戸惑うポイントがいくつかあります。それをいくつかご紹介。
シェルスクリプトの構文がbashなどとは違う
bashの構文がわかりにくいということで、fishではわかりやすい独自の構文に変更されている部分がありますが、それが戸惑いを引き起こすこともあります。
例として、andを意味する&&
がfishでは使えません。
debian系OSでパッケージを更新するときにapt update && apt upgrade
というのをよくやりますが、fishでは&&が使えないために、このコマンドはエラーとなり実行できません。
fishが受け付けるコマンドに置き換えると apt update; and apt upgrade
となります。
;
で一度コマンドを区切り、and
でコマンドを結合する必要があります。
なお、||
も使えず、セミコロンで区切った後or
を使い結合する必要があります。なんかpythonっぽいですね。
他にも、if ~ fi
などの条件式も構文が違います。詳しくはこの辺りを。
fishrcが存在しない
おなじみ~rcファイルがfishには存在しません。
では、どこで~rcファイルに書いていた設定を書くのかというと、~/.config/fish
にあるconfig.fishというファイルに記載します。
当然ですが、bash系の記法は使えませんので、先に書いた独自の構文で記述する必要があります。なお、環境変数の設定はconfigに記載する以外にも、シェル上で直接設定することもできます。
シェル上で設定しても、その環境変数は永続化されますので、個人的にはシェル上で直接設定する方が好みですね。
肝心の設定方法ですが、fishではexportは使わず、setコマンドを使って設定します。
config.fishに記載する場合
set PATH /usr/local/bin $PATH
シェル上で設定する場合
set -U fish_user_paths /usr/local/bin $fish_user_paths
$fish_user_pathsとは、fishのユニバーサル変数の1つで、$PATHより先に読み込まれる変数です。
まとめ
最初に書いた通り、自分は基本的にデフォルトのまま使うことが多いので、インストールするだけで上記の機能が使えるfishは超快適です。
*rcファイルの違いやスクリプト文法の違いから、zshなどを使って.zshrcをゴリゴリカスタマイズしているような人には、これらの違いがストレスになる可能性があるのであまりオススメできないと思います。
逆にあまりいじらずデフォルトのまま使っている方や、zshで補完などをガンガン効かせたいけど、なんだか面倒そう・・・という方は試してみる価値はあるでしょう。