WSL環境に fish shell を入れたらいい感じのターミナルになった

## 背景
年明けから会社でWSL2(Ubuntu) 環境で開発を行うことになり、shellを使う機会が多くなりました。

モブプロをやっている時に、先輩の画面を見て変わったプロンプトだなと思って聞いてみたら、
[fish shell](https://fishshell.com/) なるものだと教えてもらったので、試しに入れてみました。

自分用メモを兼ねてまとめてみます。

## 使用感
まだ使い始めてから3日くらいしか経っていませんが、今までデフォのbashしか使っていなかったのでとっても便利！と感じました。

具体的には以下の点が良かったです。
- デフォルトで強力な補完が使える
- プラグインの追加が楽(これは最近の他のshellではそうかもですが)
- インストールからいい感じの見た目になるまでの手順が楽

ちょっとした手順で画像のような見やすいターミナルになりました！
![プロンプト目標.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877519/0b2360db-7195-9c16-0b1f-c7d248dfe6d4.png)

ただ、若干文法が異なるようなので、そこだけは要注意です。

## 前提
以下の環境でセットアップしました。
- Windows WSL2(Ubuntu) 
- [Homebrew](https://brew.sh/index_ja)はインストール済み 

Windows10 でも Windows11 でもどちらでも今回紹介する手順でセットアップできます。(若干画面操作の経路は異なります)


## セットアップ

検索すると結構Mac向けの記事が多いのですが、wslの記事だとだとフォント周りがやや面倒くさいです。

先ほど紹介した見た目にすることをゴールに進めていきます。

### fish のインストール

任意のフォルダで以下コマンドでインストール。
```bash
brew install fish
```

fish のバージョンの確認。
`fish` と入力してバージョンが表示されればOKです！
```bash
fish -v
fish, version 3.3.1
```

早速 `fish` と入力して fish shell に入りましょう。

```bash
fish
```
この時点で補完が効くようになっているので十分便利です。

### プロンプトの見た目をいい感じにする

デフォルトだとカレントディレクトリがわかりづらかったり、Git のブランチが表示されないので、
ここからはいい感じの見た目にしていきます。

fish を起動した状態で `fish_config` を実行するとブラウザが起動し、ブラウザ上で配色テーマをはじめとする様々な設定が行えます。
それでも十分にいい感じのみためになりますが、今回はプラグインを入れて見た目を変えていきましょう。
(ちなみに、設定ファイルをいじくり回せば、もっと自分好みの細かいカスタマイズができるようです。)

#### fisher(プラグインマネージャー)のインストール
まずはプラグインを管理するツールを入れます。  
いろいろあるようですが、　fisher(フィッシャー) が良さそうだったので今回はこれを使います。

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

#### テーマを設定

```bash
fisher install oh-my-fish/theme-bobthefish
```

試しに、Git で管理しているプロジェクトに移動してみましょう！
Git のブランチがいい感じに表示されていると思います。

**なお、この時点では以下のように文字化けしています。**
![文字化け.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877519/6614292d-cabb-7346-bb76-cc53a332bfda.png)

#### 文字化けを解消
以下のそれぞれで開く際の文字化けを解消します。
- WSLのUbuntuのターミナル
- Windows Terminal
- VSCodeのターミナル

##### 事前準備
Windows上にフォントをインストールします

1. [Cicaのプロジェクトから最新のもの](https://github.com/miiton/Cica/releases)をダウンロードして任意のフォルダに解凍
2. Windowsのスタートの検索ボックスで「フォント」を検索 > 「フォント設定」を開く > 解凍したファイルの `.ttf` 拡張子のもの(複数あります)をドラッグアンドドロップ
![フォントインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877519/ced584cf-4228-719c-8d23-eb63ed76703d.png)


##### WSLのUbuntuのターミナルの設定変更

Windowsの検索ボックスからUbuntuのターミナルを起動します。
タイトルバーを右クリック > プロパティを開く > フォント からCicaを選択して「OK」

![フォント選択_ubuntu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877519/30856ba8-6321-f807-2a87-9448cb24e150.png)

fish を開くと文字化けが直っています。
すでに fish をひらいている場合は一度 `exit` で fish から出て、入り直してください。

##### Windows Terminal

###### 1. Windows Terminal を起動します。
###### 2. タブの末尾のVのようなマークをクリックして「設定」を開きます
###### 3. 画面左したの歯車アイコンをクリックします(初回はどのプログラムでファイルを開くか聞かれます。)
![WindowsTerminal設定選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877519/27d8c0e6-fdce-4f20-cd24-47e26f32ba97.png)

###### 4. 設定ファイルを編集します。
指定したエディタで json ファイルが開きます。
profiles > list に色々なターミナルの設定があるので、その中の Ubuntu の設定の末尾に `,` を追加して、その一行下に `"fontFace": "Cica"` を追加して保存してください。
![WindowsTerminalプロファイル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877519/858a11ee-5d95-116c-9b19-8ff64dc9715b.png)
※2022年11月6日追記
追記時点では `fontFace` 属性は非推奨となっているようです。
元々 `"fontFace": "Cica"` で設定していたものを、以下のように設定した方がよさそうです。
[参考 : Windows ターミナルでの外観プロファイル設定](https://learn.microsoft.com/ja-jp/windows/terminal/customize-settings/profile-appearance#font-face)
```
"font": {
  "face": "Cica"
}
```

###### 5. Windows Terminal を再起動してください

以上でWindows Terminal 上での文字化けが直ります。

##### VSCodeのターミナル
※前置き： VSCode から WSL にアクセスする際には、[Remote Development プラグイン](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)が必要です。

VSCodeを開き、「Ctrl+Shift+p > ターミナル: ターミナル設定の構成」から、`Terminal › Integrated: Font Family` の項目 を Cica にします。
![VSCodeのターミナル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877519/aca0244d-8aab-ad1c-fccb-484e241850e5.png)

VSCode から WSL のプロジェクトを開き、ターミナル上で fish を起動してください。

これで VSCode 上でも文字化けせずにいい感じで fish が使えます！

#### 仕上げ：プロンプトの表示内容を設定
文字化けも解消されて、大分いい感じになりました。
しかし、まだ日付フォーマットがおかしかったり、ディレクトリ名が省略されています。
次はこれを調整します。

fishは `~/.config/fish` ディレクトリ以下に様々な設定を持っています。
今回は、`~/.config/fish/config.fish` の設定を変更します。

こんな感じで以下の `set` から始まる2行を追加します。
```fish
if status is-interactive
    set -g theme_date_format "+%Y-%m-%d %H:%M:%S" # 日付のフォーマットを変更(例： 2022-03-01 23:22:22)
    set -g fish_prompt_pwd_dir_length 0           # フォルダ名が省略されていたものを省略しなくする
    # Commands to run in interactive sessions can go here
end
```

設定が完了したら、 fish を再起動してください。

おめでとうございます！
こんな感じの見た目になったと思います。
![プロンプト目標.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877519/0b2360db-7195-9c16-0b1f-c7d248dfe6d4.png)


## おまけ： fish 起動時にかわいいお魚を表示
ここまで読んでくださってありがとうございます。
最後に、[fish_logo](https://github.com/laughedelic/fish_logo) というかわいいお魚を表示するプラグインがあるので紹介します。
個人的にかなり惹かれたので、起動時に表示してみましょう。  

fish を起動して以下を実行します。
```fish
fisher install laughedelic/fish_logo
```

`~/.config/fish/functions/fish_greeting.fish` に `fish_logo` を追記します。
```
function fish_greeting -d "What's up, fish?"
    set_color $fish_color_autosuggestion
    uname -nmsr

    # TODO: `command -q -s` only works on fish 2.5+, so hold off on that for now
    command -s uptime >/dev/null
    and command uptime

    set_color normal
    echo "Hello FISH!!!" # せっかくなのでごあいさつ
    fish_logo            # お魚を呼び出す
    
end
```

起動時にかわいいお魚がお出迎えしてくれます。
![最終形.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877519/c805eed8-c323-82be-37c3-50ca8b921ee2.png)

## 最後に
ここでは、 fish をログインシェルにしたりいろいろなプラグインの紹介は書いていませんが、
いろいろ試して書き足していこうと思っています。

ここまで読んでくださった方、ありがとうございました。

## 参考
- [【完全版】fish shell ~スーパーコマンドライン~](https://zenn.dev/sawao/articles/0b40e80d151d6a)
- [fish shellベースのターミナル環境を整える](https://www.cyokodog.net/blog/fish-based-terminal-environment/)
- [WSL2+fish+CicaでWidnowsにお洒落なシェルを構築する](https://ateruimashin.com/diary/2021/03/wsl2_fish_shell/)
- [Ubuntu 20.04 に Cica フォントをインストールする](https://zenn.dev/miwarin/articles/cab5028258b6df)