[WSL2] Win10でzsh+preztoを使ってPowerline環境を作る

Windows 10上で1からWSL2の色々な環境をセットアップする方法をまとめます。

## セットアップするもの

タイトルの通り、この記事ではほぼ更地のWindows 10から以下の環境を構築していきます。

- Windows 10上のWindows Subsystem for Linux 2 (Ubuntu)環境
- Windows Terminal上でzsh＋preztoを使ったPowerline環境
- (おまけ)最後に、brewを使ったrbenvおよびnodenvの環境

## 筆者の環境

- Microsoft Surface Laptop 3
- Windows 10 Home (Build 19041.1)

この記事で前提として必要なものは、**Windows 10(ビルド18917以降)のみ**です。

~~WSL2に対応したWindows 10のビルドは記事執筆時点ではWindows Insiderに参加してアップデートする必要があります。~~

**追記**：2020年6月のWindows 10 **バージョン2004**（Build 19041）の正式リリースにより、現在はWindows Insiderへの参加は必要_ありません_。

## WSL1 on Windows 10

WSL2を使うためには、**WSL1を入れる→それをWSL2にアップグレードする**という手順が必要です。

まず、`コントロールパネル`→`プログラムと機能`を開き、WSLを有効化します。

<img width="348" alt="{363F858E-FD96-49AA-A324-1405CE5F7221}.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376302/9831835a-dd87-1740-13f7-b2614f3f2ab0.png">

**Windows Subsystem for Linux**の項目にチェックを入れ、システムを再起動するとWSLが有効になります。

Microsoft Storeで**「WSL」**と検索するとWSL用のLinuxディストリビューションがいくつか出てきます。

ここでは、**Ubuntu**を選択します。インストールして起動すると、OSインストールが始まります(筆者の環境では1分半くらいかかりました)。

インストール完了後、UNIXのユーザー名／パスワードを入力して設定完了です。

<img width="512" alt="コメント 2020-01-11 221309.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376302/9f8a0d44-54d4-9bf0-1284-4655ac038619.png">

最初はこんな感じのターミナル環境になります。

## WSL2にする

さて、そろそろWSL1にはお別れを告げて、このディストリビューションをWSL2にアップグレードしましょう。

WSL1をWSL2に変換するために、**管理者権限のPowershell**を開き、以下を実行します(多少時間がかかるかも？)。

```
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
```

完了後、再起動を求められるので再起動し再び管理者権限のPowerShellで次のコマンドを実行し、WSL1のディストリビューションをWSL2に変換する作業を行います。

```
wsl --set-version Ubuntu 2
```

筆者の環境では変換に5～6分かかりました。

> ここで「WSL 2 を実行するには、カーネル コンポーネントの更新が必要です」と表示される場合は、https://aka.ms/wsl2kernel からWSLカーネルの更新をダウンロードする必要があります。

`wsl -l -v`を実行してみて、WSLの「Ubuntu」の**VERSION**が2になっていればOKです！

ちなみに、Windows側からWSL2のUbuntu内のファイルは`\\wsl$\Ubuntu\`というディレクトリから参照できます。ブラウザで`file://///wsl$/Ubuntu/`にアクセスすることもできると思います。

## brewを入れる

様々なパッケージをインストールできるよう、**brew**を使えるようにします。

ここからは、PowershellではなくUbuntuを触っていきます。WindowsからUbuntuを起動した時のデフォルトのターミナルではなく、**Windows Terminal**というターミナルが高機能・オシャレで色々カスタマイズもできる(後述)のでそちらを利用するといいと思います。

#### Windows Terminal

- https://www.microsoft.com/store/productId/9N0DX20HK701

ほかにも、UWPベースのモダンなWindows向けターミナルアプリにFluent Terminalがあります。お好きなものを使ってください。

#### Fluent Terminal

- https://www.microsoft.com/ja-jp/p/fluent-terminal/9p2krlmfxf9t

Windows Terminalなどで `Ubuntu` を起動したら、まずaptのupdate/upgradeをしておきます。

```sh
sudo apt update
sudo apt upgrade
```

[brewのドキュメント](https://docs.brew.sh/Homebrew-on-Linux)に従って、公式にWSL対応となったLinuxbrewをインストールします。

```sh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
sudo apt install build-essential curl file git
```

`gcc`や`make`などのコマンドを使えるようにするため、`build-essential`を入れています。

`Warning: /home/linuxbrew/.linuxbrew/bin is not in your PATH.`という警告が出ます。

パスを通すため、次のコマンドを順番に実行します。

```sh
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
```


`brew doctor`を実行してみて、問題がなければbrewのインストールは完了です。

## zsh on Ubuntu on WSL2 on Windows 10

zshは**brewを使ってインストール**できます。

```sh
brew install zsh
```

いろいろな依存パッケージを入れていくので少し時間がかかります。

インストールが完了したら、zshをデフォルトのシェルに変更します。`which zsh`を実行すると、zshのパスが分かります。

```sh
which zsh | sudo tee -a /etc/shells
chsh -s /home/linuxbrew/.linuxbrew/bin/zsh
```

`etc/shells`にzshのパスを書き込み、`chsh`コマンドでデフォルトのシェルを変更します。

Windows Terminalを起動し直すと、zshが立ち上がります(`zsh`コマンドを実行してもOKです)。

これでzshのインストールは完了です。最初にzshを立ち上げるとこんな感じで「`.zshrc`とかがないみたいだけどどうする？」と聞かれます。

<img width="534" alt="コメント 2020-01-13 005213.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376302/3f3e641c-175c-d783-f2a3-997a21b22551.png">

0を選択すると空の(コメントアウトだけの)`~/.zshrc`を作ってくれます。1を選ぶと対話式に質問されて設定を完了できます。

が、今回は`q`を入力して一度無視します(この次でファイルを作成します)。

## preztoを入れる

次にzshをいい感じに設定してくれる**prezto**を入れます。これを使うとPowerlineの導入が楽になります。

次のコマンドを実行するとホームディレクトリにpreztoがクローンされます。

```sh
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

完了したら、次のコマンドを実行します。

```sh
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

これにより、`~/.zshrc`や`~/.zprofile`などの必要なファイルをいい感じに生成・設定してくれます。

zshを起動し直すと、設定が適用されていて先程の初期設定の質問もされなくなります。

## brewのパスを通す

さっき`~/.bash_profile`にbrewのパスを通しましたが、zshにはまだ通っていないため、brewが使えません。

```sh
echo 'export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >> ~/.zshrc
```

`~/.zshrc` に `export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"` を追記すればOKです。

## Powerline on zsh on Ubuntu on WSL2 on Windows 10

次に、**Powerline**を設定します。`prompt -p`コマンドを実行すると利用可能なテーマの一覧が表示されるので好きなもの(もちろん、Powerline以外のテーマでも)を選びましょう。

私は`agnoster`が好きなので設定しようと思います。しかし、ここで**Powerline対応フォント**がWindows側に必要になります。

#### Powerline fonts

- https://github.com/powerline/fonts

まずはお好きなPowerline対応フォントを探してWindowsにインストールします。私のお気に入りは[Noto Mono for Powerline](https://github.com/powerline/fonts/tree/master/NotoMono)です。

フォントをインストールしたら、ターミナル(ここではWindows Terminal)の設定を開きます。Windows Terminalは`Ctrl`+`,`で設定ファイルのjsonが開きます。任意のエディタで編集します。

**"profiles"**という項目にそれぞれのシェルの設定が格納されています。**"defaultProfile"**の項目にUbuntuのGUIDを貼り付けると、Windows Terminalの起動時にデフォルトでUbuntuが立ち上がるようになります。

```(一例)profiles.json
{
    // Ubuntu
    "guid": <ここにGUID>,
    "hidden": false,
    "name": "Ubuntu",
    "source": "Windows.Terminal.Wsl",
    "useAcrylic": true,
    "acrylicOpacity": 0.75,
    "fontFace" : "Noto Mono for Powerline",
    "startingDirectory": "//wsl$/Ubuntu/home/",
    "padding": "10, 10, 10, 10",
    "cursorShape": "filledBox"
}
```

私の場合は、上のような設定にしました(一部抜粋)。

Windows Terminal、まだベータ版でプロファイルの設定方法がコロコロ変わるみたいなので詳しくは触れませんが、`"fontFace"`**にPowerline対応フォントを指定してあげればOK**です。

ちなみに、**"acrylicOpacity"**はウィンドウ背景の透過の設定です。Microsoftのドキュメントに[settings.jsonの詳しい説明](https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/global-settings)があります。

`prompt -s <テーマ名>`でテーマを設定し、設定時に指定されるものを `~/.zshrc` に追記します(以下はagnosterの場合)。

```~/.zshrc
autoload -Uz promptinit
promptinit
prompt agnoster
```

ターミナルを再起動すれば、晴れてzshでのPowerlineが完成です！

<img width="519" alt="コメント 2020-01-13 014939.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376302/599dec21-595b-4c24-2c59-fbe917cf4902.png">

Windows上でこんなに手軽にUbuntuの環境が構築できるのは感動です。

ここまででWSL2上でのzsh／Powerline環境づくりはひとまず完了です。ここから先はおまけです。

## pecoを入れる

**[peco](https://github.com/peco/peco)**を入れるとコマンド履歴のインクリメンタルサーチができたりとても便利になるので紹介します。

```sh
brew install peco
```

インストールが完了したら、`~/.zshrc`にpecoの設定を追記します。

```~/.zshrc
function peco-history-selection() {
    BUFFER=`history -n 1 | tac  | awk '!a[$0]++' | peco`
    CURSOR=$#BUFFER
    zle reset-prompt
}

zle -N peco-history-selection
bindkey '^R' peco-history-selection
```

`Ctrl`+`R`でpecoを起動できるように設定しています。

---

## rbenv on zsh on Ubuntu on WSL2 on Windows 10

次は、Rubyの複数バージョンをインストール・管理できる**rbenv**を使ってRuby(主にRuby on Rails)の開発環境を作ります。

Rubyなんかやらないという人は読まなくてOKです。

ここで`build-essential`が必要になります。

```sh
brew install rbenv
```

これも様々な依存パッケージを入れていくので時間がかかると思います。

完了したら、`~/.zshrc`に以下の内容を追記します。

```~/.zshrc
eval "$(rbenv init -)"
```

これでrbenvのインストールは完了です。`rbenv install -l`でインストール可能なRubyのバージョン一覧が出てきます。

`rbenv install <バージョン>`を実行すればRubyをインストールできると思います。

`BUILD FAILED`になった時は、エラーに必要な依存が見つからないとあるので書いてあるコマンドを叩きます。

```sh
sudo apt install libssl-dev zlib1g-dev
```

インストール後、再度`rbenv install <バージョン>`を実行でOKです。

また、Bundlerのバージョンが1.x系なので2に上げたい場合は`gem install bundler`を実行しましょう。

## nodenv on zsh on Ubuntu on WSL2 on Windows 10

次は、node.jsのバージョン環境管理ための**nodenv**をインストールします。

同じくnodeは触らないという方は読まなくてよいです。

```sh
brew install nodenv
```

インストールは簡単です。完了したら`~/.zshrc`に`eval "$(nodenv init -)"`を追記してください。

`nodenv install <バージョン>`で任意のバージョンをインストールできます。グローバルに指定する時は`nodenv global <バージョン>`です。

`brew install yarn`を実行すればyarnをインストールすることができます。


## 参考

- WSL 2 のインストール | Microsoft Docs - https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install
- 【WSL】LinuxにHomebrewを導入する - Qiita - https://qiita.com/cogome/items/96056450b51fb5b9b782
- Homebrew 1.9.0 でWindows+WSLに対応したので導入してみた - Qiita - https://qiita.com/R-Koubou/items/26498fc0bfa011667961
- WSL2を操作しようとすると「カーネル コンポーネントの更新が必要です」と表示される - Qiita - https://qiita.com/quzq/items/3de595e14426d0352fc4
- WSLでWindowsの中にLinuxの開発環境を作ろう - Qiita - https://qiita.com/h-yoshikawa/items/15653d08f917ad6e39f8
- Linuxbrew のススメ - Qiita - https://qiita.com/thermes/items/926b478ff6e3758ecfea
- Documentation — Homebrew Documentation - https://docs.brew.sh/
- zshの設定:メモ - Qiita - https://qiita.com/rorono/items/9dd56f775078f5bd5815
- zshで初回起動したときに対話的にzshrcを作成する - Qiita - https://qiita.com/mollifier/items/6481de1aa2d1033ad2ec
- preztoでzsh構築した時のメモ - Qiita - https://qiita.com/Angelan1720/items/60431c85592fe90fcdd5
- Windows Terminal Setting ベータ版 - Qiita - https://qiita.com/syui/items/3236495744a16d982464
- Windows Terminal (Preview) メモ - Qiita - https://qiita.com/rubytomato@github/items/e88cab84f36e44797cf2
- peco/peco: Simplistic interactive filtering tool - https://github.com/peco/peco
- pecoを使って端末操作を爆速にする - Qiita - https://qiita.com/reireias/items/fd96d67ccf1fdffb24ed
- powerline/fonts: Patched fonts for Powerline users. - https://github.com/powerline/fonts
- 最新の Ruby と Rails をインストールして Rails プロジェクトを作成する - Qiita - https://qiita.com/ryamakuchi/items/12d794437cde733f8ece