WSL2 + Windows Terminal + fish で快適なターミナル環境を構築しよう！（2023 年版）

開発環境を構築しなおす機会があったので、自分用のメモを兼ねて書きました。

[WSL2 (Windows Subsystem for Linux 2)](https://learn.microsoft.com/ja-jp/windows/wsl/about) 環境で shell を [fish](https://fishshell.com/docs/current/) として環境構築していきます。
Linux のディストリビューションは [Ubuntu](https://ubuntu.com/) を利用します。
また、[Windows Terminal](https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701) を利用してテーマ、色、フォントなどをカスタマイズしていきます。

## fish とは

fish（通常は "friendly interactive shell" として知られる）は、ユーザーフレンドリーさを特徴とする Unix シェルの一つです。

## fish を利用するメリット

1. **優れた自動補完機能**: fish は、入力中のコマンドや引数に基づいて、リアルタイムでのサジェストを提供します。これはコマンドの記憶や新しいコマンドの学習に非常に役立ちます。また、色分けされた表示によって、見た目も直感的でわかりやすいです。
1. **設定の容易さ**: fish には、他のシェルのような複雑な設定ファイルが不要です。ウェブベースの設定ツールを介して簡単にプロンプトの見た目や動作をカスタマイズできます。また、スクリプトや関数の作成も直感的で、学習が他のシェルより容易な印象です。
1. **豊富なプラグインとテーマ**: fish には、様々なプラグインとテーマが提供されており、これにより機能の追加や見た目のカスタマイズが非常に容易です。特に fisher や Oh My Fish といったプラグインマネージャを利用すると、多くのプラグインやテーマを簡単にインストール・管理できます。

以下からインストール手順を記載していきます。

## WSL2

[WSL のインストール | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/wsl/install) を参考にインストールをします。
PowerShell または Windows コマンド プロンプトを管理者モードで開き、`wsl --install` コマンドを入力します。

```powershell
wsl --install
```

このコマンドで WSL version2、また Ubuntu 22.04（2023年7月30日現在）がインストールされます。
（少し前まではもういくつかの手順が必要でした）
インストール完了後、PC を再起動します。
再起動後、自動的に Ubuntu アプリが起動します。
初回起動時にユーザー名とパスワードを設定する必要があります。

## Windows Terminal

Microsoft Store アプリ からダウンロードします。

[Windows Terminal - Microsoft Store アプリ](https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701?hl=ja-jp&gl=jp&icid=TopNavWindowsApps)

### Windows Terminal を利用するメリット

1. **複数のタブとプロファイル**:
   Windows Terminal は複数のタブで同時に異なるシェルやアプリケーションを動かすことができます。この機能により、例えば、WSL (Windows Subsystem for Linux)、PowerShell、Cmd などを同じウィンドウ内の異なるタブで並行して動作させることが可能です。それぞれのタブは異なるプロファイル設定を持つことができるので、外見や動作を独自にカスタマイズすることもできます。

2. **高度なカスタマイズ性**:
   Windows Terminal は、外見や動作をユーザーの好みに合わせてカスタマイズすることができます。例えば、フォントの変更、背景の透明度や背景画像の設定、色テーマのカスタマイズなどが簡単にできます。これにより、作業効率を高めるだけでなく、使用感も向上します。

3. **GPU アクセラレーションと高度なレンダリング**:
   Windows Terminal は GPU アクセラレーションを使用しており、テキストの描画が非常に高速です。また、テキストはアンチエイリアシングや ClearType の技術を使用して描画され、文字が非常に鮮明で読みやすくなっています。さらに、絵文字や豊富な文字セットをサポートしており、よりリッチな表現が可能となっています。

### Windows Terminal の設定

最低限、以下を設定するといいと思います。

- スタートアップ
- Ubuntu > 外観（フォント設定に関しては後述）

好みなので、いろいろ試してみましょう。
参考までに、自分の例は以下となっています。

**（スタートアップ）**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110368/08359d0b-9dd4-b97b-b2a4-51c708b615bc.png)

**（Ubuntu > 外観）**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110368/f15cbfa5-0298-697c-6f48-88b2f7d300c1.png)

### Windows Terminal のショートカット

ショートカットを覚えると操作効率が上がるため、よく使う操作についてはぜひ覚えてください。

- [超便利！Windows Terminal のショートカットキー一覧｜タブ作成や画面分割を簡単にする方法やキーの調べ方](https://prograshi.com/general/command/windows-terminal-shortcut-keys/)

## Visual Studio Code

[Visual Studio Code](https://code.visualstudio.com/) をインストールしていない場合は Windows にインストールしてください。
また、WSL2 から VSCode を操作するため、拡張機能 [Remote Development - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) をインストールしておくといいでしょう。

## Git

Ubuntu にデフォルトでインストールされている Git は最新バージョンでないことがあるため、以下を実行します。

```sh
sudo add-apt-repository ppa:git-core/ppa
sudo apt update && sudo apt upgrade
```

アップデート後、バージョン確認をします。

```sh
$ git --version
git version 2.41.0
```

[Git](https://git-scm.com/) に記載されている `Latest source Release` と一致していれば OK です。

## zip & unzip

後続の手順で利用します。
デフォルトの Ubuntu にはインストールされていないため、インストールします。

```sh
sudo apt install zip unzip -y
```

## fish

[og:fish-shell/fish-shell: The user-friendly command line shell.](https://github.com/fish-shell/fish-shell/#packages-for-linux) を参考にインストールをします。

```sh
sudo apt-add-repository ppa:fish-shell/release-3
sudo apt update
sudo apt install fish -y
```

以下のように `fish` コマンドが機能すれば OK です。

```sh
$ fish
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
```

デフォルトのシェルを fish に変更しましょう。
`which fish` で fish がインストールされているパスを確認し、`chsh` コマンドでシェル設定を変更します。

```sh
$ which fish
/usr/bin/fish
$ chsh -s /usr/bin/fish
```

## Fisher

fish のプラグインマネージャー `fisher` をインストールします。

[jorgebucaran/fisher: A plugin manager for Fish](https://github.com/jorgebucaran/fisher)

```sh
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
```

## asdf

asdf とは 開発言語（Node.js、Python など）や開発ツール（AWS CLI, AWS SAM CLI, Terraform など）のバージョンを管理できるコマンドラインツールです。
後続の [ghq](#ghq--fzf) をインストールするために asdf をインストールします。
asdf をインストールする理由は、ghq のパッケージマネージャのひとつとして asdf が利用でき、かつ自分のチームでは開発言語等のバージョン管理に asdf を利用していて都合がいいためです。
ghq は `brew install` や `go install` などでもインストール可能なので、特に普段 asdf を利用していない方はインストール不要です。

[Getting Started | asdf](https://asdf-vm.com/guide/getting-started.html)

asdf の最新バージョンをダウンロードします。

```sh
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.12.0
```

`▼ Fish & Git` のインストールコマンドを実行します。

`~/.config/fish/config.fish` に以下を追記します。

```sh
# asdf
source ~/.asdf/asdf.fish
```

補完は次のコマンドを使用して手動で構成する必要があります。

```sh
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
```

バージョン確認し、動作すれば OK です。

```sh
$ asdf --version
v0.12.0-816195d
```

### Windows Terminal の外観をカスタマイズする

#### テーマ

ターミナルのテーマを自分の好みに合わせて変更していきます。
テーマの一覧は [oh-my-fish/docs/Themes.md at master · oh-my-fish/oh-my-fish](https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md) を参照してください。
自分は Powerline-style が好きなので、`theme-bobthefish` にします。

[oh-my-fish/theme-bobthefish: A Powerline-style, Git-aware fish theme optimized for awesome.](https://github.com/oh-my-fish/theme-bobthefish)

まずはテーマを fisher でインストールします。

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

この時点で Git 管理しているディレクトリへ移動すると、文字化けしています。
文字化けを解消するために、フォント設定をします。

#### フォント

好みのフォントをインストールします。
ここでは [yuru7/HackGen: Hack と源柔ゴシックを合成したプログラミングフォント 白源 (はくげん／HackGen)](https://github.com/yuru7/HackGen) を使用します。

[miiton/Cica: プログラミング用日本語等幅フォント Cica(シカ)](https://github.com/miiton/Cica) も人気があると思うので、お好みでどうぞ。
（単純にスター数と最近の更新頻度を見て白源を採用しました）

##### Windows へのインストール

- https://github.com/yuru7/HackGen/releases より、最新版の Assets をダウンロードします。
  - Nerd Fonts でアイコンフォントも使用したいので HackGen Console NF を使用します。
  - 2023 年 7 月 16 日時点の最新は `HackGen_NF_v2.9.0.zip`
- 任意のフォルダで zip を解凍します。
- Windows キーを押して表示される検索ボックスに「フォント設定」と入力し、検索結果を開きます。
  - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110368/658028d4-8e1a-5c7a-76e8-d964eaadcd2b.png)
- 解凍後のフォルダ内にある `*.ttf` ファイルを全選択して、フォント設定画面にドラッグ＆ドロップします。

##### Windows Terminal でのフォント設定

- Windows Terminal を開きます。
- `Ctrl + ,` で設定画面を開きます。
- 左側メニューよりプロファイル `Ubuntu`（ペンギンアイコンじゃない方） を開きます。
- `追加の設定` > `外観` を開きます。
- `フォントフェイス` で `HackGen Console NF` を指定します。
  - この時点で「フォントが見つかりません」と言われるが、再起動で解決するため気にしなくていい
- Windows Terminal 再起動します。
  - 文字化けが解消しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110368/75c8179f-935e-0934-3d69-705c6affa5c6.png)

##### Visual Studio Code でのフォント設定

- VSCode を開きます。
- `Ctrl + Shift + p` > `Preferences: Open Settings (UI)` を選択します。
- 設定の検索バーに `terminal.integrated.fontFamily` と入力します。
- `Terminal › Integrated: Font Family` 設定に `HackGen Console NF` を指定します。
- VSCode のターミナルを開きます。
  - 文字化けが解消しています。

## GitHub SSH 接続

[GitHub に ssh 接続できるようにする - Qiita](https://qiita.com/0ta2/items/25c27d447378b13a1ac3) を実施します。
ただし、`秘密鍵をssh-agentに登録する` のパートのみ、[WSL2 の Ubuntu で keychain 経由で ssh-agent を使う#keychain の導入](https://zenn.dev/kaityo256/articles/ssh_agent_on_wsl#keychain%E3%81%AE%E5%B0%8E%E5%85%A5) を実施します。
記事の冒頭に記載があるように、最後のコマンド `source $HOME/.keychain/$HOST-sh` の箇所は `source $HOME/.keychain/$HOST-fish` として実行します。

## fish の便利なプラグイン

fish での操作効率性を上げるプラグインをインストールしていきます。

### fzf

fzf は、コマンドラインでのインタラクティブな検索・選択をサポートする高速なフィルタリングツールです。
入力された行データからインタラクティブに曖昧(fuzzy)検索を行ってくれるコマンド(fuzzy finder)です。
いろいろすごいので、とりあえず以下サイトのデモを見てください。

[PatrickF1/fzf.fish: 🔍🐟 Fzf plugin for Fish](https://github.com/PatrickF1/fzf.fish)

以下のコマンドでインストールしていきます。

```sh
sudo apt install fzf -y
sudo apt install bat -y
sudo apt install fd-find -y
alias fd='fdfind' && funcsave fd
alias bat='batcat' && funcsave bat
fisher install PatrickF1/fzf.fish
```

`Ctrl + R` で [📜 Search History](https://github.com/PatrickF1/fzf.fish#-search-history) のスクショのようなコマンド履歴検索画面が出れば OK です。

### ghq + fzf

ghq は、GitHub やその他のリモートリポジトリのローカルクローンを整理し管理するためのツールです。
特に、多数のリポジトリをクローンしてローカルで管理する開発者にとって非常に便利です。
ghq を使用することで、リポジトリの統一されたディレクトリ構造を維持しつつ、複数のリポジトリを簡単に取得・移動・調査することができます。
リポジトリの検索には fzf を利用します。

[x-motemen/ghq: Remote repository management made easy](https://github.com/x-motemen/ghq) の `asdf-vm` のインストールコマンドを実行します。
※ `asdf` を利用していない人は、`go` や `brew` などお好みのパッケージマネージャを利用してインストールしてください。
`asdf` 以外でのインストール方法は上記公式サイトをご参照ください。

```sh
asdf plugin add ghq
asdf install ghq latest
asdf global ghq latest
```

fish プラグイン [decors/fish-ghq: ghq completion and keybinding for fish shell](https://github.com/decors/fish-ghq) もインストールしておきます。

```sh
fisher install decors/fish-ghq
```

`~/.config/fish/config.fish` に起動設定を追記します。

```fish
# fisherパッケージ decors/fish-ghq の設定
set GHQ_SELECTOR fzf
```

インストール後、ghq を利用してリポジトリをクローンします。

```sh
ghq get git@github.com:<org>/<repo>.git
```

複数リポジトリをインストールした後、`Ctrl + g` でリポジトリをあいまい検索し、Enter で選択したローカルリポジトリのディレクトリに移動できていれば OK です。
[6 歳娘｢パパ、プロジェクトフォルダを見つけるのに何時間かけるの？｣【ghq+fzf+zsh】 - Qiita](https://qiita.com/tomoyamachi/items/e51d2906a5bb24cf1684#%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%8B) の GIF 画像のようなイメージになります。

### z

過去にアクセスしたディレクトリを追跡します。
頻度と最新性を組み合わせて、念頭に置いたディレクトリにジャンプできます。

[jethrokuan/z: Pure-fish z directory jumping](https://github.com/jethrokuan/z)

`cd` コマンドの履歴から指定された相対パスに部分一致するパスを検索しています。
`z` をインストールした後にアクセスしたことあるディレクトリにしか行けません。
Tab での補完もできます。

以下のとおりインストールします。

```sh
fisher install jethrokuan/z
```

以下のように動作確認できれば OK です。

```sh
cd ~/.config/fish/ # 移動したいディレクトリへアクセス
cd ~ # 動作確認のため、他の適当なディレクトリへ移動
z fish # ~/.config/fish/ へ移動できる
```

### fish-bd

ディレクトリを上に遡れるプラグインです。

[0rax/fish-bd: Quickly go back to a parent directory up in your current working directory tree. Don't write 'cd ../../..' redundantly, use bd instead.](https://github.com/0rax/fish-bd)

以下のとおりインストールします。

```sh
fisher install 0rax/fish-bd
```

以下のように動作確認できれば OK です。

```sh
bd # cd ..
```

### 起動時に fish ロゴを表示

[WSL 環境に fish shell を入れたらいい感じのターミナルになった - Qiita の「おまけ： fish 起動時にかわいいお魚を表示」](https://qiita.com/suzuSho/items/32b6a0759f6c8283cd79#%E3%81%8A%E3%81%BE%E3%81%91-fish-%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E3%81%8B%E3%82%8F%E3%81%84%E3%81%84%E3%81%8A%E9%AD%9A%E3%82%92%E8%A1%A8%E7%A4%BA) を参考にすると、起動時に fish ロゴを表示できるようになります。

シェルは fish が利用されていると自分にも他人にも分かりやすいので、入れておくといいと思います。

## その他

### wslu

fish シェルで `aws sso`  コマンドなどを使うときなど、ターミナルからブラウザを開けるようにするためにインストールします。

```sh
sudo apt install wslu
```

`~/.config/fish/config.fish` に起動設定を追記します。

```fish
# wslu
export BROWSER=wslview
```

## 終わりに

以上で環境構築は終わりです。
他にもおすすめなプラグインや操作方法があればぜひ教えてください。

fish を初めて使う人、見知らぬコマンドがあった人は、ぜひ手になじむまで繰り返し使ってみてください。
きっと開発効率が向上すると思います！
それでは楽しい fish ライフを！

## 参考サイト

- [Linux 初心者が WSL2 と Windows Terminal のセットアップをやってみた | DevelopersIO](https://dev.classmethod.jp/articles/linux-beginner-wsl2-windowsterminal-setup/)
- [超便利！Windows Terminal のショートカットキー一覧｜タブ作成や画面分割を簡単にする方法やキーの調べ方](https://prograshi.com/general/command/windows-terminal-shortcut-keys/)
- [WSL2 の Ubuntu で keychain 経由で ssh-agent を使う](https://zenn.dev/kaityo256/articles/ssh_agent_on_wsl)
- [詳解 fish でモダンなシェル環境の構築(fish,tmux,powerline,peco,z,ghq,dracula) - Qiita](https://qiita.com/susieyy/items/ac2133e249f252dc9a34)
- [【完全版】fish shell ~スーパーコマンドライン~](https://zenn.dev/sawao/articles/0b40e80d151d6a)
- [fish shell が結構良かった話 - Qiita](https://qiita.com/hennin/items/33758226a0de8c963ddf)
- [Mac で fish shell 環境を 10 分で構築する](https://zenn.dev/stag_buster/articles/14fe49409c8f7d)
- [WSL2 + Windows Terminal で fish のセットアップ](https://zenn.dev/mammon/articles/90b27354f3ed37)
- [WSL 環境に fish shell を入れたらいい感じのターミナルになった - Qiita](https://qiita.com/suzuSho/items/32b6a0759f6c8283cd79)
- [fish を使ってみて分かったメリットや設定のコツ | blog.ojisan.io](https://blog.ojisan.io/to-fish/)
- [6 歳娘｢パパ、プロジェクトフォルダを見つけるのに何時間かけるの？｣【ghq+fzf+zsh】 - Qiita](https://qiita.com/tomoyamachi/items/e51d2906a5bb24cf1684)
- [文化的な fish 環境を得る為の最短ルート - Qiita](https://qiita.com/YuukiMiyoshi/items/4a52516744530cd60e47)
- [fish と fzf はじめて 豊かになりました / fish and fzf is good - Speaker Deck](https://speakerdeck.com/fruitriin/fish-and-fzf-is-good?slide=24)
- [fish で「パスを通す」ための最終解答](https://zenn.dev/estra/articles/zenn-fish-add-path-final-answer)
- [[fish] 展開される alias - abbr - Qiita](https://qiita.com/wataash/items/ab0a8b86b60e782f537f)