初心者向け！見た目がかっこいいシェル環境を作る！(Fishシェルを使ってみよう)

# Fishシェルとは
Fishシェル（Friendly Interactive SHell）は、ユーザーフレンドリーでインタラクティブなシェルとして設計されたUnixシェルです。

ゴールはこんな感じになります。

> ![f16f6b2c-6c35-11e6-8eb9-9f23ea3cce2e.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639915/99b3221e-ae2c-2a77-24b6-169be784983c.gif)
> 引用: https://github.com/oh-my-fish/theme-bobthefish


## Zshでいいじゃん
別にZshでいいじゃんという人もいるかと思いますので、ChatGPTにFishとZshを比べたときの利点を聞いてみました。


> FishシェルとZshシェルを比較した際のFishシェルの利点は以下の通りです：
> - 直感的な構文: Fishは、よりシンプルで直感的な構文を提供しています。特に、条件分岐やループの記述が簡潔で、初心者でも理解しやすいです
> - 自動補完の強化: Fishの自動補完機能は非常に強力で、リアルタイムでコマンドやオプション、ファイル名の候補を表示します。Zshでも補完機能はありますが、Fishはデフォルトでより使いやすい設計になっています
> - シンタックスハイライト: Fishは、入力中のコマンドに対してシンタックスハイライトを提供し、エラーや警告を視覚的に示します。これにより、間違ったコマンドを入力するリスクが減ります
> - 設定の簡素化: Fishの設定ファイルはシンプルで、ユーザーがカスタマイズしやすいです。Zshの設定は複雑になりがちですが、Fishはより直感的に設定できます
> - デフォルトでの機能充実: Fishはデフォルトで多くの便利な機能が組み込まれており、追加の設定やプラグインなしで使いやすいです。Zshは多くの機能を持っていますが、初期設定ではそれらを有効にするための追加の設定が必要です
> - スクリプトの簡単さ: Fishでは、スクリプトを書く際に、変数の宣言や関数の定義が簡単に行えます。Zshに比べて、スクリプトの可読性が高いと感じるユーザーが多いです
> - エラーメッセージの明確さ: Fishは、エラーメッセージが明確で、何が問題であるかを理解しやすいです。Zshのエラーメッセージは時に難解なことがあります
> 
> これらの利点により、Fishシェルは特に初心者やシェルを快適に使いたいユーザーにとって魅力的な選択肢となっています。

この中でシンタックスハイライトについて実際に見てみると以下の様な形で表示されます。

- 正しいコマンド例
![スクリーンショット 2025-01-27 15.28.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639915/89ebd668-8c7f-716c-a9d3-12bf29fcb93a.png)
- 間違ったコマンド例
![スクリーンショット 2025-01-27 15.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639915/5038d9ec-51b0-b6eb-7d0e-a4509d082f34.png)

これならタイプミスも一発で分かりますね。

## Fishのインストール
恒例ですがMacOSはbrewでインストールができます。WSL組は各ディストリビューションのパッケージインストールコマンドか、brewを導入してみてもいいかと思います。
```
brew install fish
```

インストールができたらパスを確認しておきましょう。
```
which fish
```

MacOSであれば`/opt/homebrew/bin/fish`と出てくるかと思いますので、これをシェルの管理リストに追記してあげます。
```
echo /opt/homebrew/bin/fish | sudo tee -a /etc/shells
```

追記できたら、ログインシェルを変更していきます。
```
chsh -s /opt/homebrew/bin/fish
```

これで無事、Fishシェルを使う準備ができました。

### 設定ファイル
Fishの設定ファイルは`~/.config/fish/config.fish`になります。

#### brewの設定
初期状態のままではbrewが使えないので設定に少し手を加えます。

```
if status is-interactive
  # Homebrew
  eval (/opt/homebrew/bin/brew shellenv)
end
```

`if status is-interactive`というのは、簡単に言えばユーザーがコマンド入力可能な状態かどうかの判定になります。
ここまでできたら、ターミナルを再起動するか`fish`コマンドでFishシェルを起動してみましょう。
`brew`コマンドが使えるなら、正しく設定できています。

#### Pathの追加
Fishシェルにパスを追加したい(パスを通したい)場合があるかと思います。そういった場合は`fish_add_path`を利用します。
例えば、`~/.local/bin`にパスを追加したい場合は`config.fish`に以下のように記述します。

```
if status is-interactive
  ...

  # add path
  fish_add_path $HOME/.local/bin
end
```

### fish_config
`fish_config`コマンドを使うとブラウザが立ち上がり、設定をGUIから変更することができます。
この辺りも初心者ライクな仕様ですね。いろいろ触ってみてください。

![スクリーンショット 2025-01-28 16.27.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639915/02d57d5f-5311-9fac-4200-2757819ea542.png)



## Oh My Fish!
急にどうしたと思われるかもしれませんが、`Oh My Fish!`というのはFishシェルのフレームワークになります。プラグインマネジャーって言ってもいいかもしれません。
テーマの追加等もomf経由で行うことができます。

https://github.com/oh-my-fish

インストール方法は以下の通りです。
```
curl https://raw.githubusercontent.com/oh-my-fish/oh-my-fish/master/bin/install | fish
```

インストールできたら`omf`と打ってみましょう。USAGEが出てきたらOKです。

例えば、自分が使っているテーマは`bobthefish`というものになります。
最初に見せたテーマがこれですね。Gitステータス表示もいい感じです。

https://github.com/oh-my-fish/theme-bobthefish

> ![f16f6b2c-6c35-11e6-8eb9-9f23ea3cce2e.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639915/99b3221e-ae2c-2a77-24b6-169be784983c.gif)
> 引用: https://github.com/oh-my-fish/theme-bobthefish

こちのテーマは前回の[初心者向け！とりあえず見た目がかっこいいNeovimの設定](https://qiita.com/Shankou/items/d875de74babe1369f703)で行ったNerdFontのインストールが必要になるので注意して下さい。

インストール方法は以下のコマンドOKです。
```
# インストール
omf install bobthefish
```

### 設定ファイル
`bobthefish`の設定は`~/.config/fish/conf.d/bobthefish.fish`に記載しましょう。
先程のGithubのページに様々な設定項目について説明があるので気になるものがあったら設定してみましょう。
デフォルトのままでも全く問題はありませんが、`set -g theme_show_project_parent no
`を設定すると、プロジェクトルートではそれより上の階層表示がされなくなり、少し見やすくなります。
また、`theme_date_format`を使うと右プロンプトの日時表示をカスタマイズすることができます。

```
# プロジェクト内では、親パスは表示しない
set -g theme_show_project_parent no
# 右プロンプトの日時フォーマット
set -g theme_date_format "+%F %H:%M:%S"
```

# 終わりに
初心者向けの見た目がかっこいいシリーズは一旦以上になるかと思います。

黒い画面の現実に直面して挫折する人がよくいますが、何もしないまま絶望するよりは、見た目から入って慣れ親しむ努力をする方が絶対にいいです。

Fishシェルとりあえず触ってみてください！