Bash on Windowsでクリップボード共有

先日配信開始されたWindows 10 Creators Updateにより、Bashでも「Ubuntu 16.04」がサポートされると共に日本語表示やネットワーク周りのコマンドが強化されてかなりまともに使える様になりました。
今までホストとのクリップボードの共有が出来ずにCygwinからの完全乗り換えに二の足を踏んでいましたが、Windowsのプログラムの実行も可能となった事でほぼ満足の行く環境が構築出来たので忘備録的に記して行きたいと思います。Creators Updateの方法自体は他の記事を参照してください。

##現状のBashを削除する
Anniversary UpdateでインストールされたBashはそのままではアップグレードされませんので、一旦アンイストールして新規インストールを行います。コマンドプロンプトを起動し
`lxrun /uninstall -y`
でアンインストールです。/fullオプションを付けなければホームディレクトリはそのまま残ります。
##新しいBashをインストール
`lxrun /install -y`
で新しいバージョンをインストールします。
##ホームディレクトリの変更
デフォルトのホームディレクトリの場所は`C:\Users\USERNAME\AppData\Local\lxss\home\username`ですが、何かと不便なのでここで変更しておきます。私はDドライブに作ったhomeディレクトリに変えました。
まずはコマンドプロンプト上で一旦デフォルトユーザーをrootにします。
`lxrun /setdefaultuser root`

このままrootユーザーでBashを起動し、下記の手順で設定します。「username」は自分のユーザー名で置き換えてください。
`# vi /etc/passwd`
`username:x:1000:1000:"",,,:/home/username:/bin/bash` の行を
`username:x:1000:1000:"",,,:/mnt/d/home:/bin/bash` に変更して保存。
自分のユーザ名にパスワードを設定します。
`# passwd username`

続けてコマンドプロンプトでデフォルトユーザを自分に戻します。
`lxrun /setdefaultuser username /y`
終わったら一旦Bashのウィンドウを閉じます。

##日本語環境の設定
再度Bashのコンソールを起動し、/etc/apt/sourses.listを以下の様に編集します。

```vim:/etc/apt/sourses.list
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial main restricted universe multiverse
deb-src http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial main restricted universe multiverse
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial-updates main restricted universe multiverse
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial-security main restricted universe multiverse
```

下記コマンドを入力し一気に日本語化しましょう。 

```bash
$ sudo apt-get update
$ sudo apt-get install language-pack-ja
$ sudo update-locale LANGUAGE=ja_JP.UTF-8 LC_ALL=ja_JP.UTF-8 LANG=ja_JP.UTF-8
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```
##win32yankでクリップボード共有
win32yank - https://github.com/equalsraf/win32yank/releases
win32yank.exeは、X Window System上のxselコマンドの様にWindowsのクリップボードを読み書き出来る便利なツールです。上記URLからダウンロードさせて頂いて解凍後Windows側でパスの通ったディレクトリに配置します。これだけでBashのコンソール上で
`win32yank.exe -o`
でクリップボードの中身が見れて
`echo "hello world!" | win32yank.exe -i`
等の様にしてクリップボードに書き込みが出来ます(.exeは省略できません)。
##tmuxの設定


下記の手順で最新のtmuxをインストールします。

```bash
$ sudo apt-get build-dep tmux
$ git clone https://github.com/tmux/tmux.git
$ cd tmux
$ sudo ./autogen.sh
$ sudo ./configure
$ sudo make
$ sudo make install
```
.tmux.confには下記を追記します。vimモードでの設定例です。

```vim:~/.tmux.conf
# <prefix> [でコピーモードに入った時に、vで選択を開始しyもしくはEnterで選択範囲をコピー

# コピーモードでvimキーバインドを使う
setw -g mode-keys vi

# 'v' で選択を始める
bind-key -T copy-mode-vi v send -X begin-selection

# 'y'と'Enter'でcopy-pipe-and-cancelを使う
bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel "win32yank.exe -i"
unbind -T copy-mode-vi Enter
bind-key -T copy-mode-vi Enter send -X copy-pipe-and-cancel "win32yank.exe -i"

# マウス選択でもcopy-pipe-and-cancel
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "win32yank.exe -i"

# <prefix> pでクリップボードからペースト
unbind-key -T prefix p
bind-key p run "win32yank.exe -o | tmux load-buffer - && tmux paste-buffer"
```
##Vimの設定



[fakeclip](https://github.com/kana/vim-fakeclip)というプラグインがBash on Windowsでも使える筈なのですが、何故か私の環境で上手く動かなかったのでとりあえず下記の設定を行いました。

```vim:~/.vimrc
nnoremap <silent> <Space>y :.w !win32yank.exe -i<CR><CR>
vnoremap <silent> <Space>y :w !win32yank.exe -i<CR><CR>
nnoremap <silent> <Space>p :r !win32yank.exe -o<CR>
vnoremap <silent> <Space>p :r !win32yank.exe -o<CR>
```

これでとりあえず`[Space]+[y]`でクリップボードにヤンク、`[Space]+[p]`でペースト出来る様になります。

Vimの設定が少々惜しい感じですが、とりあえずかなり便利に使える様になりました！