WSL の 覚書（+ ホームディレクトリの変更）


## <i class="fa fa-paw fa-fw"></i>はじめに
WSL をはじめて使うので，私の備忘録代わりのメモにします． `DrvFS` に metafata を付与して，`Linux` 側のパーミッションを保持できるようになったので，ホームディレクトリを `DrvFS` 上に持っていきます．一度，`wsl.conf` の設定が有効にならなかったので諦めてたのですが，もう一度試してみたら有効になったので変更しました．前回は typo していたのかもしれません．

## <i class="fa fa-leaf fa-fw"></i> Windows
`HP Spectre 13-af000` を購入したのファンクションキーと `Ctrl` と `Caps Lock` の変更します．

* ファンクションキーの設定

電源投入後，`ESC` を押してメニューを表示させ、`F10` から `BIOS` の設定をする．`System Configuration` → `Action Keys Mode` を `Disabled` に変更する．

* キーの入替え

`Caps lock(0x003a)` を `左Ctrl(0x001d)` に、`左Alt(0x0038)` と `左Win(0xe05b)` を入れ替える．
`regrdit` を起動して，【HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout】に【Scancode Map】(REG_BINARY) を追加する(参考: 1d,00,3a,00, (変更後)（変更前）)．

```
00 00 00 00 00 00 00 00
04 00 00 00 1d 00 3a 00
5b e0 38 00 38 00 5b e0
00 00 00 00
```
## <i class="fa fa-leaf fa-fw"></i> WSL
いろいろなところに情報がありますが，取り敢えず作業した内容をメモします．

### インストール
* `コントロールパネル` → `プログラム` → `Windows の機能の有効化または無効化` から `Windiws Subsystem for Linux` を有効にして再起動．

* `Microsoft Store` から `Ubuntu 18.04` をインストール

### 初期設定
スタートメニューから `Ubuntu 18.04` を起動してユーザの作成をする．

* システムの更新

プロキシ環境なら下記の設定を行う．

```bash
$ export http_proxy=http://サーバ名:ポート番号/
$ export https_proxy=$http_proxy
$ export ALL_PROXY=$http_proxy
```

`sudo apt update`,`sudo apt upgrade` でシステムの更新を行う．プロキシ環境なら `sudo -E apt update`,`sudo -E apt upgrade` のように `-E` を付けてコマンドを実行する．

```bash
$ sudo -E apt update
$ sudo -E apt upgrade
```

* 日本語 Locale

```bash
$ sudo -E apt install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
```
`exit` で `Ubuntu` を終了して，もう一度 `Ubuntu` を起動する．`echo $LANG` でロケールが変更されているか確認する．

* 日本語 manpage の導入

```bash
$ sudo -E apt install manpages-ja manpages-ja-dev
$ sudo apt autoremove
```

* タイムゾーンの設定

```bash
$ sudo dpkg-reconfigure tzdata
```

* 開発環境のインストール

```bash
$ sudo -E apt install build-essential
$ sudo -E apt install gdb
```

* フォント関連
Windows と共通のフォントを利用する場合は，Windows にフォントをインストールする．

```bash
$ sudo ln -s /mnt/c/Windows/Fonts /usr/local/share/fonts/windows
$ sudo fc-cache -vf
```

`Powerline` のパッチを当てたフォントのような Linux からしか利用しないものに関しては，`$HOME/.local/share/fonts` にフォントをコピーして，`fc-cache -vf` を実行する．知らなかったのですが，`$HOME/.local` 以下に置くのがお作法みたいですね．

* Hyper ターミナル

`https://hyper.is/` からダウンロードしてインストールする．
`%USERPROFILE%\appdata\local\hyper` に本体があるので，スタートにピン留めする．

`WSL(Ubuntu 18.04)` が起動するように，`%USERPROFILE%\.hyper.js` を編集する．

```
fontSize: 14,
shell: 'C:\\Windows\\System32\\wsl.exe',
shellArgs: [],
```

* VcXsrv Windows X Server

`https://sourceforge.net/projects/vcxsrv/` からダウンロードしてインストールする．
(スタートメニューとデスクトップのショートカットのチェックを外す)．

`C:\Program Files\VcXsrv\vcxsrv.exe` を右クリックして，プロパティを開き `高 DPI 設定 の変更` → `高 DPI スケール設定の上書き` にチェックをいれ，アプリケーションにする．

### ホームディレクトリの変更
`WSL` のデフォルトユーザを変更するのに必要な `[distro.exe]` が分からなくて悩みました．`Microsoft Store` の `Ubuntu 18.04` の説明文に `ubuntu1804` とあります．ただし，管理者権限の{コマンドプロンプト，PowerShell}からしか `PATH` が通っていないようで，気づくまで無駄に時間がとられました．

* Drvfs の `/mnt/c` を `metadata` 付きで自動マウント

`/etc/wsl.conf` に下記内容で作成して，`WSL` を立ち上げ直します.

```bash:/etc/wsl.con
[automount]
options = "metadata,umask=22,fmask=11"
```

`mount -l` コマンドで

```bash
C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,metadata)
```

のように，`metadata` が付与されているのを確認する．

ホームディレクトリ の場所を `C:\home` 以下に変更するので，C ドライブに `home` フォルダを作成しておきます．

管理者権限でコマンドプロンプトを起動して，下記の手順でホームディレクトリを変更します．念のためバックアップをとることをおすすめします．

```cmd
% ubuntu1804 config --default-user root
% wsl
# usermod -d /mnt/c/home/xxx -m xxx (xxx はユーザ名)
# exit
% ubuntu1804 config --default-user xxx
% wsl
```

`pwd` コマンドや `/etc/passwd` からホームディレクトリが変更できているか確認します．
`usermod` の `-m` は，現在のホームディレクトリを新たに指定したホームディレクトリに移すオプションです．

###  Emacs
[NTEmacs @ ウィキ](https://www49.atwiki.jp/ntemacs/pages/61.html) の設定です．ありがとうございます。

* インストール

```bash
$ sudo -E apt install emacs-25
$ sudo -E apt install cmigemo
```

`.bashrc` などに下記設定を追加．

```bash:.basrc
# emacs setting
export DISPLAY=localhost:0.0

if [ "$INSIDE_EMACS" ] ; then
    TERM=eterm-color
fi

(
    command_path="/mnt/c/Program Files/VcXsrv/vcxsrv.exe"
    command_name=$(basename "$command_path")

    if ! tasklist.exe 2> /dev/null | fgrep -q "$command_name"; then
        "$command_path" :0 -multiwindow -clipboard -noprimary -wgl > /dev/null 2>&1 & #
for us-keyboard
    fi
)

alias emacs="NO_AT_BRIDGE=1 LIBGL_ALWAYS_INDIRECT=1 emacs"
```

ターミナルから `emacs` と打って，Emacs が起動するのを確認する．

* Google 日本語入力

`Google 日本語入力` を利用するので，取り敢えずインストールします．`Microsoft IME` を使わないので，入力方式エディターから削除します．

`設定` → `時刻と言語` → `地域と言語` → `日本語` を選択した，オプションをクリックっして，キーボードの `Microsoft IME` を削除する．
`時刻と言語` → `地域と言語` → `キーボードの詳細設定` → `言語バーオプション` → `キーの詳細設定` の入力言語のホットキーの`キーシーケンス`を無効にする．

IME のプロパティ のキー設定の編集から，

* `変換前入力中`,`変換中`,`入力文字なし`→`IMEを無効化`
* `直接入力`→`IMEを有効化`

の入力キーに `C-\` を割り当てる．この設定は完全に私の好みです（普通は必要ないです）．

`mozc_emacs_helper` については，[WSL の Emacs で日本語入力](https://qiita.com/ignorant/items/1c4f729f9147fb878f10) に書いています．

* emacsclient

`init.el` に追加する．

```elisp:init.el
;;; server start for emacsclient
(use-package server
  :if window-system
  :config
  (unless (server-running-p)
    (server-start))
  :diminish (server-buffer-clients . " ⓒ"))
```

コマンドプロンプトから `wsl.exe emacsclient -n ファイル名` で開いています．`wslpath` が想定した動作をしてくれないので，カレントのファイルしか開くことができないです:persevere:．

[6/20 追記]
`wslpath` ですが引数を `'aaa.txt'` か `"..\aaa.tx "` のようにすると想定した動作になってくれました．

どこに作成したもいいのですが，`~/.local/bin` に `wslemacsclient.bat` を下記に内容で作成する．

```cmd:wslemacsclient.bat
@echo off

for /f "usebackq" %%i in (`wsl wslpath '%1'`) do set unixpath=%%i
wsl emacsclient -q -n %unixpath%
``` 

このままでは，使いづらいので `doskey` (alias みたいなもの) に登録して，アクセスしやすいようにします．
レジストリエディタを起動して，`HKEY_CURRENT_USER\Software\Microsoft\Command Processor` に移動する．
文字列値 `AutoRun` を作成し，値のデータを `doskey ee=C:\home\xxx\.local\bin\wslemacsclient.bat $1` に設定する(xxx:ユーザ名)．

コマンドプロンプトを開き，`doskey /macros` で `ee` が登録されいることを確認します．`ee ファイル名`，`ee フォルダ名\ファイル名` などで，`emacsclient` が動作することを確認します．もしくは，`wslemacsclient.bat` にファイルをドラッグして動作することを確認します（一瞬コマンドプロンプトの画面が表示される）．

私は必要ないですが，右クリックの送るメニューに追加してもいいかもしれません．
コマンドプロンプトから `start shell:sendto` を実行して `SendTo` を開き， `wslemacsclient.bat` のショートカットを作成し，プロパティから`実行時の大きさ`を`最小化`にでもすれば，いいのではと思います．

これで，`MSYS2` の `Emacs` よりはるかに快適になりました．
[6/20 追記終]

[6/22]
なぜか `PATH` の通ったところにバッチファイルを置いても `wslemacsclient.bat` のように拡張子まで入力しないと，上手くいかなかったので `doskkey` にバッチファイルを登録していましたが，拡張子なしでも動作するようになった（？）ので，`doskey` の登録はやめました．
[6/22 追記終]