WSL2でシェルをzshに変更して優勝する

# はじめに
今回の記事は過去の自分に向けたドキュメントのつもりで書いております。
冗長な部分もあるかもしれませんがご容赦ください。

ターミナルってかっこいいですよね

# 対象者🙋‍♂️
- いつも使っているターミナルをかっこよくしたい人
- コマンド入力をより便利にしたい人
- Windowsでもzshを使いたいという人

**※Windows11ユーザ目線で書いていますが、最近のMacは最初からzshなので途中の設定は使えるはず。。。**

# 完成イメージはこちら
1. 見た目が派手 👈️
1. 現在のbranchを表示
1. コマンド部分をハイライト
1. cdコマンドを省略できる
1. 入力履歴をもとにコマンドをサジェストする
1. ctrl+rで入力履歴をグラフィカルに表示&選択可能

![display](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895295/5dddda82-a3c4-06b4-6ca3-7f39b5a5f226.png)

![peco](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895295/4085ead7-0130-ede7-5083-d490b5284019.png)

# やること

## ツールのインストール
Windowsユーザーの方はMicrosoft Storeで「Windows Terminal」をインストールしてください。

タブ機能とか複数種類のターミナルが開けたり、多機能でかなり便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895295/0d985221-ad89-5248-55f7-2fd22dae46eb.png)

## WSL2の設定
WSL2とは？
>Linux 用 Windows サブシステム (WSL) を使用すると、開発者は、従来の仮想マシンまたはデュアルブート セットアップのオーバーヘッドなしで、ほとんどのコマンドライン ツール、ユーティリティ、アプリケーションなどを含む GNU/Linux 環境を、変更せずに Windows 上で直接実行できます。

Windows上でLinuxが使えるようになるものです。
自分の環境では設定済みでしたので、思い出しながら書きます。

### PowerShellを管理者権限で開いて以下を実行
```powershell:PowerShell
wsl --install
```
インストール完了後に再起動を求められるので、PCを再起動。

powershellで以下のコマンドを打つと、Ubuntuが入ってるはず
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895295/9a3cad4c-b1c8-757e-1afd-d43bb8471aa8.png)

### ユーザー名とパスワードの設定
Windows TerminalからUbuntuを開くと、Linux用のユーザー名とパスワードの設定を求められる。
今後よく使うので、パスワードは忘れないように控えておく。

設定後は、最初のお作法としてこれをとりあえず打っておく。
```console:bash
$ sudo apt update && sudo apt upgrade
```

## zshに変更
### 現在のshell確認
```console:bash
$ echo $SHELL
```
おそらく`/bin/bash`と表示される。

### zshのインストール&変更
```console:bash
$ sudo apt install zsh
$ chsh -s $(which zsh)
```
ここまで終わったら、ターミナルを開き直すことでzshに変更されている。

```console:zsh
$ echo $SHELL
```
以下のように表示されていたら成功
`/usr/bin/zsh`

## oh my zshのインストール
oh my zshとは？(以下、公式の翻訳)
>Oh My Zsh は、Zsh 構成を管理するための、楽しくオープン ソースのコミュニティ主導型フレームワークです。何千もの便利な機能、ヘルパー、プラグイン、テーマ、そして思わず叫びたくなるような機能がバンドルされています...

ターミナルのテーマを変更したり、便利なプラグインを入れたりできます。

```console:zsh
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
```
インストールが完了したら、カラフルな画面が表示される。

## プラグインのインストール
zshの拡張機能にはインストール方法が色々ありますが、今回はoh my zshのプラグインとして導入したいと思います。
```console:zsh
$ git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
```
```console:zsh
$ git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
```

## pecoのインストール
pecoとは？
> シンプルなインタラクティブフィルタリングツール

検索履歴、gitブランチ、Dockerコンテナなどなど...をグラフィカルに表示してくれるものです。
検索してみると様々な方が便利な設定をしているので、興味のある方は調べてみてください。

```console:zsh
$ sudo apt install peco
```

## .zshrcの設定
zshの設定は.zshrcに記載していきます。
何かしらのエディタでファイルを開きましょう。
```console:zsh
$ vim ~/.zshrc
```
```console:zsh
$ code ~/.zshrc
```

以下に自分の設定したものを載せます。

自分の好みでいろいろな設定を弄りましたが、不要なものがあれば外してください。
```config:.zshrc
~~~

# テーマ設定
ZSH_THEME="agnoster"

~~~

plugins=(
        git
        zsh-syntax-highlighting
        zsh-autosuggestions
)

~~~

# zsh の補完機能有効化
autoload -Uz compinit && compinit -u

# alias
alias d='docker'
alias dc='docker compose'

# ctrl+d でのログアウト対策
setopt IGNOREEOF

# Ctrl+s のロック, Ctrl+q のロック解除を無効にする
setopt no_flow_control

# 同時に起動したzsh の間で履歴を共有する
setopt share_history

# 直前と同じコマンドの場合は履歴に追加しない
setopt hist_ignore_dups

# 同じコマンドを履歴に残さない
setopt hist_ignore_all_dups

# ディレクトリ名だけでcd する
setopt auto_cd

# ctrl+r で過去に実行したコマンドを選択できるようにする。
function peco-select-history() {
  BUFFER=$(\history -n -r 1 | peco --query "$LBUFFER")
  CURSOR=$#BUFFER
  zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history
```

今回は[こちら](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#agnoster)のテーマを設定しました。
※このテーマを設定する場合は、そのままだと文字化けが起こるのでフォントのインストールが必要です。

### Powerline fontsのインストール
少し手間ですが、一度WSL内にクローンした後、PowerShellを使用してインストールします。
これでWindows Terminalのフォントを変更することができるようになります。
```console:zsh
$ cd /var/tmp # 適当なディレクトリに移動する
$ git clone https://github.com/powerline/fonts.git
```
PowerShellを管理者権限で開く。
クローンした場所のパスはエクスプローラー等で確認。
```powershell:PowerShell
cd \\wsl.localhost\Ubuntu\var\tmp\fonts
Set-ExecutionPolicy Bypass
.\install.ps1
Set-ExecutionPolicy Default
```

少し時間がかかるので待つ。

インストールが完了したら、Windows Terminalを開き、以下の場所にあるフォントを変更する
`設定 > プロファイル > Ubuntu > 外観 > フォントフェイス`

Powerlineと記載のあるフォントならだいたい大丈夫のはず。
自分は「Droid Sans Mono for Powerline」を選択しました。

# おわりに
自分もまだまだ勉強中ですが、いったん自分が満足するものを作れました。
いままで黒い画面に苦手意識のあった方が、興味を持つきっかけになると嬉しいです。

# 参考
- [Windows Subsystem for Linux に関するドキュメント](https://learn.microsoft.com/ja-jp/windows/wsl/)
- [WSL を使用して Windows に Linux をインストールする方法](https://learn.microsoft.com/ja-jp/windows/wsl/install)
- [oh my zsh](https://ohmyz.sh/)
- [oh my zshテーマ一覧](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes)
- [zsh-autosuggestionsのインストール](https://github.com/zsh-users/zsh-autosuggestions/blob/master/INSTALL.md)
- [zsh-syntax-highlightingのインストール](https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md)
- [peco](https://github.com/peco/peco)
- [fonts](https://github.com/powerline/fonts)

# 参考にさせていただいた記事🙇‍♂️
- [【WSL2】WSL2環境でOh my zshを入れてAgnosterのテーマを適用する](https://qiita.com/kazuki_yoshida/items/a66a52ef813e168195bb)
- [ターミナルにzsh-autosuggestions、zsh-syntax-highlightingプラグインを導入](https://qiita.com/y-matsumoto/items/9acc0046f143a236c167)
- [WSL: シェルをBashからZshへ変更する](https://qiita.com/yoshi_yast/items/5eaa917e567b3add55ac)
- [pecoを使ったらターミナルの操作が劇的に効率化できた話](https://qiita.com/keisukee/items/9b815e56a173a281f42f)