WSLコンソールのコピペ方法まとめ（Vim,Tmux)

## bash on Cmderからzsh on WSLコンソールへ乗り換え
ここ数年、Windows10でシェルを使うときはcmderでbashを使っていたのですが、最近はWSL(Windows Subsystem for Liux)を使っています。WSLだと普通にLinuxが使えるので、zshも楽々インストールできるし、Python環境もAnacondaに縛られなくてもよくなるし、もはや、Linuxを使うためにMacを買う必要なんてありませんね。
でも、WSLが利用できるデフォルトのコンソール（**WSLコンソール**）は、コマンドプロンプトをベースにした、非常にシンプルなもので、正直使いづらい。。
たいていの人はcmderなどのエミュレータからWSLを使っているかと思うのですが、cmder+WSL+Tmuxで使うと、マウスでペインの操作ができなかったり、ステータスバーの更新がうまく表示されなかったりして、こりゃまた使えない。。
そこで仕方なく、WSLコンソールを使っています（WSLの今後に期待を込めて）。なんとかストレスなく作業できる程度まで設定できたのですが、特にコピペ方法の設定で苦戦したので、ショートカットキーとクリップボードとの連携方法をまとめておきます。
これを機に、WSLコンソールユーザーが増えれば幸いです！

## コピペ方法

作業シーンごとのコピペ方法をまとめるとこんな感じです。基本的にはtmuxで使っているので赤字の方法だけ覚えていれば何とかなります。

|作業シーン|コピー|貼り付け|
|---|---|---|
|WSLコンソール|①マウス選択+エンター<br>②マウス選択+右クリック<br>③マウス選択+Ctrl+Shift+C|①右クリック<br>②Ctrl+Shift+V|
|Tmux on WSLコンソール|<font color="red">①コピーモード(`prefix+[`)でVisualモードで範囲指定してy（vimモード）</font><br>②コピーモード(`prefix+[`)でマウスで選択した状態でエンター<br>③コピーモード(`prefix+[`)でダブルクリックで選択してエンター|<font color="red">Ctrl+Shift+V</font>|
|Vim on WSLコンソール|y  |p  |
|（参考）notepadなど|Ctrl+C  |Ctrl+V  |

（注意）tmuxでコピーしたものをtmuxに貼り付ける場合は、`prefix+]`でもOKですが、tmux以外（vimやnotepadなど）からコピーしたものをtmuxに貼り付けようとすると`prefix+]`では貼り付けられません。その場合は、Ctrl+Shift+Vで貼り付けます。



## 設定方法

### WSLコンソールのショートカットキーによるコピペ機能有効化
WSLコンソールのプロパティ画面の［オプション］タブにある［編集オプション］セクションで［Ctrl+Shift+C/Vをコピー/貼り付けとして使用する］のチェックを入れます。
この機能は、Windows 10 Insider Preview Build 17643（RS5）以降で利用できるようになった機能で、これまでのコマンドプロンプトの独特なコピペ方法を解消してくれて便利なんですが、tmuxを起動するとコピーモードとしては使えなくなるようです。

### XサーバとしてVcXsrcをインストール

WSLではXサーバがなくて、xselが使えないため、vimとクリップボードが連携できません。
そこで、XサーバとしてVcXsrcをインストールして、環境変数`DISPLAY`を設定します。インストール方法は[このあたり](https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html)を参考にしてください。
初回起動時に設定ファイル（～.xlaunchファイル）を保存しておいて、`.zshrc`でこの設定ファイルを実行するようにしておくと便利です。以下では、多重起動も禁止しています。

```zsh:.zshrc
if [ -e /mnt/c/WINDOWS/System32/wsl.exe ]; then
    export DISPLAY=localhost:0.0
    # auto run vcxsrv
    if [ -z "$(tasklist.exe | grep vcxsrv)" ]; then
        cmd.exe /c config.xlaunch
    fi
fi
```


### Tmuxをvimモードで使う

コピーモードのキーバインドをviにするため、`.tmux.conf`に設定を追加します。
Macでは、`reattach-to-user-namespace pbcopy`でクリップボードに渡しますが、WSLの場合は使えません。
WSLでは`clip.exe`や`win32yank.exe`を使う方法があるようですが、XサーバとしてVcXsrcをインストールしていれば、Linuxと同様にxselが使えます。

```config:.tmux.conf
setw -g mode-keys vi
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"
unbind -T copy-mode-vi Enter
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"
```

viキーバインドにしておくと、`prefix+[`の後でvimの検索機能が使えて便利です。

### Vimのクリップボード連携

WSLのデフォルトのvimはUbuntuのデフォルトのvimと同じくvim-tinyで、クリップボード連携が使えないです。
`sudo apt install vim-gnome`で`vim-gnome`をインストールして、`.vimrc`に以下を追加してください。

```vimscript:.vimrc
set clipboard=unnamedplus
```

## その他

### WSLの再起動

WSLのtmuxはたまに暴走するのでプロセスをkillしたくなりますが、暴走するとWSLコンソールからkillできなくなります。その場合は、Windowsのタスクマネージャーでプロセスを直接おとすか、WSLを再起動すればいいです。WSLの再起動はWSL上からはできなくて、コマンドプロンプトで`wsl --terminate Ubuntu`とたたく（Ubuntuはディストリビューション名）。

### リファレンス
* [ターミナルマルチプレクサ tmux をカスタマイズする](https://qiita.com/b4b4r07/items/01359e8a3066d1c37edc#%E3%82%B3%E3%83%94%E3%83%BC%E3%83%A2%E3%83%BC%E3%83%89)
* [WSL上のvimでクリップボードを共有する方法](https://qiita.com/miyagaw61/items/c299c452a105a6a9f50a)
* [Vimでクリップボードからのペーストを可能にする](https://sy-base.com/myrobotics/vim/vim_use_clipboard/)