fish shellのはじめかた 2019冬


PONOS Advent Calendar 2019の1日目の記事です。

⛄はじめに

fish shellは「Friendly interactive shell」の略で、bashとはzshの代替として使えるコマンドラインシェルです。他のシェルと比べてかな〜り後発なこともあって、初期状態でも十分高機能かつ使いやすく作られています。

この記事では、fish本体とパッケージマネージャ・カスタマイズ方法についてサラッと解説し、初fishの方がとりあえず使えるようになることを目指します。

この記事の対象者

  • デフォルトのシェルを使い続けていて、そろそろ変えてみたい人
  • fish shellを使ったことがない人
  • fish shellを試したことがあるけど、色々忘れちゃった人
  • 魚が好きな人

🐟fish本体の導入

fishをインストールする

公式サイトのトップページに、各OSごとのインストール方法が載っています。

とりあえず使ってみる

適当なターミナルでおもむろに fish と打ってみましょう。

bash-3.2$ fish
Welcome to fish, the friendly interactive shell
[email protected] ~>

exitすれば元のシェルに戻れます。

ログインシェルをfishにする

fishが気に入ってきたら、ログインシェルもfishに変更しましょう。

~> which fish
/usr/local/bin/fish

fishの実行ファイルがどこにいるのか調べて、

~> chsh -s /usr/local/bin/fish

chshで変更します。

📦パッケージマネージャ

プログラミング言語のように、fishにもパッケージマネージャがあります。何種類かありますが、オススメはFisher(旧名Fisherman)です。

fishfileという名前のファイルでパッケージを管理できるので、シェルの設定をgit管理している人にはとても便利です。

Fisherをインストールする

FisherのREADMEに載っているワンライナーでインストールします。(インストールと言っても、ファイルを1つ置いているだけです。)

curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish

ターミナルを再起動して、叩いてみます。

~> fisher -v
fisher version 3.2.10 ~/.config/fish/functions/fisher.fish

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

パッケージをインストールする

fisher add [GitHubリポジトリ名]でパッケージをインストールできます。(正確には、fishfileに追加→反映を一気にやっているみたいです。)

例えばjethrokuan/zをインストールする場合は、以下のようになります。

~> fisher add jethrokuan/z
created new fishfile in ~/.config/fish/fishfile
fetching https://codeload.github.com/jethrokuan/z/tar.gz/master
linking ~/.config/fish/functions/__z.fish
linking ~/.config/fish/functions/__z_add.fish
linking ~/.config/fish/functions/__z_clean.fish
linking ~/.config/fish/functions/__z_complete.fish
linking ~/.config/fish/conf.d/z.fish
added 1 package in 2.70s

fishfileにも追加されます。

~> cat ~/.config/fish/fishfile
jethrokuan/z

補足: fisherfileを直接編集

fisherfileを直接編集してfisherを実行することでも、パッケージのインストールができます。

⚙カスタマイズ

fishの設定ファイル

fishの設定ファイルは~/.config/fish/に作られます。

  • ~/.config/fish/
    • completions/
    • conf.d/
    • functions/
    • config.fish

config.fishが、bashで言う.bashrcにあたります。カラースキームを何にするかみたいな個人用設定はここに書いていく感じですね。

このファイル、読み込まれる順番が結構後のほうなので、ちょっと工夫が必要だったりします。以下、昔書いた記事からの引用。

  1. fish組み込みの設定ファイル (編集するべきじゃないファイル)
  2. システム全体向け設定 /etc/fish/config.fishなど
  3. 個人向けスニペット ~/.config/fish/conf.d/
  4. 個人向け設定 ~/.config/fish/config.fish fish shellでrbenvを使う

パッケージによってはconf.d配下にインストールされる場合がありますが、このフォルダはconfig.fishよりも先に読み込まれます。特定の環境変数を必要とするパッケージがある場合、読み込み順の関係でconfig.fishに書いていても間に合いません。

対処法として、conf.d/000-env.fishみたいなファイルを作って環境変数はそこに書く、というのが定番になっています。(名前は何でもいいですが、他のファイルよりも早く読み込まれるようにすること。)

カラースキーム設定

''fish_config''コマンドで、ブラウザ上でカラースキームの確認・設定ができます。便利。

プロンプト変更

自分でスクリプトを書いて変更したり、他の人が作ったパッケージを利用することができます。

Oh My Fishというfishのフレームワークがあるんですが、プロンプト類(テーマ)は接頭辞「theme-」を付けてまとめられています

シンプルなものからPowerLineを使ったゴリゴリカスタマイズ派まで色々ありますが、oh-my-fish/theme-bobthefishあたりがカスタマイズ性も高くて良いと思います。

プロンプトの注意点

fishにはfish_right_promptという、ターミナルの画面右端を起点としてプロンプトを表示する機能があります。コマンドの実行時間とかエラー番号を表示することが多い機能です。

これが日本語環境や絵文字と食い合わせが悪くて、だいたい表示が崩れます。

東アジアの文字幅(east asian width)とかあいまい幅(ambiguous width)の問題と言われているヤツで、tmuxとかVimで苦しめられている方も多いんじゃないでしょうか。

fish_ambiguous_widthfish_emoji_widthという設定値で幅を指定できるので、頑張れば回避できるかもしれません。(私は諦めました。)

拡張コマンド

fishでは、独自の構文(fish script)でスクリプトを書くことができます。実は先ほど出てきたプロンプトも、fish_promptというコマンド(function)を書き換えることで設定します。

Awesome fishに有名どころがまとまっているので、まずはこの範囲で試してみてください。

前述のパッケージマネージャでインストールするだけなので、めっちゃ簡単です。

📝参考になるサイト

  • fish shell documentation
    • 公式のドキュメント。
  • 全訳!fishシェル普及計画
    • fishのドキュメントを日本語訳してくれているサイト。
    • 2〜3年前の情報なのでちょっと古くなっていますが、コマンドとかそんなに変わっていないので問題ないはず。
  • Awesome fish
    • fish関係のおすすめプラグインを紹介しているリポジトリ。

明日は@e73ryoさんの「MonKey - Productivity Commands」のコマンド操作でUnity開発を効率化するです!