【memo】ConEmu で Windows Subsystem Linux のTaskを作るにはどうすればよいか？ #ConEmu #wsl #windows10


# これは何？
* windows10 の CLI インターフェースとして [ConEmu](https://conemu.github.io/) を常用しております(alphaレベルで。そうでないと全く更新が来ない…)
* その際にWindows Subsystem Linux(以下WSL)のタスクをいい感じに設定する方法を編み出したのですが、Conemu自体のノウハウがどこにも載っていなかったので、自分で書きだしてみるテストです。
* 試している環境は Windows 10 pro 1803 となりますが、多分 1709 でも大丈夫だと思われます。

## ConemuのTaskとは
* (参考URL) https://conemu.github.io/en/Tasks.html
* 前提としてこれがないと全く理解されない予感があるので…マニュアルを読み込んでいないので自分的理解の範疇です。
* Conemuはタブごとに違うコンソールプログラムを実行することが可能なのですが、実行するコンソールプログラムの設定単位を指します。
* 大まかに設定するものとしては下記が存在します

|項目名|概要|sample値|備考|
|---|---|---|---|---|
|Name|Taskの名前を決める値「::」で区切ると階層を掘ることができる| `Bash::Git bash` |GUIでポチポチやるときは階層があると便利なので纏められそうなグループは纏めておきましょう|
|Task Parameters(GuiArgs)|コマンド実行時につけるオプションの 「/icon」でアイコン表示などを行うのが主。| `/icon "C:\Windows\system32\cmd.exe"` | 色々やれそうではありますが、基本アイコン表示のみでしか使っていない|
|Commands(Cmd1) | 実際にプログラムを立ち上げる時のコマンド。 | `PATH=%ConEmuDir%\..\Git\usr\bin;%PATH%" &amp; "%ConEmuDir%\..\Git\git-cmd.exe" --no-cd --command=%ConEmuBaseDirShort%\conemu-msys2-64.exe /usr/bin/bash.exe -l -i -new_console:p` | ここがプログラム立ち上げ時のミソ。 |

## WSL の Task 作成の下準備
* WSL を作成するときにいくつか必要な情報があるので下準備としてコマンドを実行する必要があるのでここに記します。

### WSLのディストリビューション毎のGUIDを取得

* WSLにはダウンロードしたディストリビューション毎にGUIDが定められており、これは **ユーザ毎＆ダウンロード毎、毎回GUIDが変わります** 。なのでダウンロードしなおしたら再度確認する必要がある模様です。(若干嘘かもしれません) 

* GUIDは **レジストリ** に書かれているので コマンドプロンプト or powershell プロンプトから下記コマンドを実行して取得します。

```cmd
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss" /s
```

* 結果としては下記のようなものが出ます

```cmd
> reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss" /s                                                                                                                             
                                                                                                                                                                                                              
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss                                                                                                                                              
    DefaultDistribution    REG_SZ    {7f3c093-cdd9-4867-854d-r43rf8fb8bb86}                                                                                                                                   
                                                                                                                                                                                                              
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{f94rn1-9e39-472f-bf6e-25802845f1fd70b85}                                                                                                       
    State    REG_DWORD    0x1                                                                                                                                                                                 
    DistributionName    REG_SZ    Debian                                                                                                                                                                      
    Version    REG_DWORD    0x1                                                                                                                                                                               
    BasePath    REG_SZ    C:\Users\Rask4\AppData\Local\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState                                                                                      
    PackageFamilyName    REG_SZ    TheDebianProject.DebianGNULinux_76v4gfsz19hv4                                                                                                                              
    KernelCommandLine    REG_SZ    BOOT_IMAGE=/kernel init=/init ro                                                                                                                                           
    DefaultUid    REG_DWORD    0x3e8                                                                                                                                                                          
    Flags    REG_DWORD    0x7                                                                                                                                                                                 
    DefaultEnvironment    REG_MULTI_SZ    HOSTTYPE=x86_64\0LANG=en_US.UTF-8\0PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\0TERM=xterm-256color               
                                                                                                                                                                                                              
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{7f3c093-cdd9-4867-854d-r43rf8fb8bb86}                                                                                                       
    State    REG_DWORD    0x1                                                                                                                                                                                 
    DistributionName    REG_SZ    Ubuntu                                                                                                                                                                      
    Version    REG_DWORD    0x1                                                                                                                                                                               
    BasePath    REG_SZ    C:\Users\Rask4\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState                                                                                
    PackageFamilyName    REG_SZ    CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc                                                                                                                        
    KernelCommandLine    REG_SZ    BOOT_IMAGE=/kernel init=/init ro                                                                                                                                           
    DefaultUid    REG_DWORD    0x3e8                                                                                                                                                                          
    Flags    REG_DWORD    0x7                                                                                                                                                                                 
    DefaultEnvironment    REG_MULTI_SZ    HOSTTYPE=x86_64\0LANG=en_US.UTF-8\0PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\0TERM=xterm-256color               
                                                                                                                                                                                                              
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{485r34r-17f0-4e2c-4873-a297a85fjiofb28e6}                                                                                                       
    State    REG_DWORD    0x1                                                                                                                                                                                 
    DistributionName    REG_SZ    openSUSE-42                                                                                                                                                                 
    Version    REG_DWORD    0x1                                                                                                                                                                               
    BasePath    REG_SZ    C:\Users\Rask4\AppData\Local\Packages\46932SUSE.openSUSELeap42.2_022rs5jcyhyac\LocalState                                                                                           
    PackageFamilyName    REG_SZ    46932SUSE.openSUSELeap42.2_022rs5jcyhyac                                                                                                                                   
    KernelCommandLine    REG_SZ    BOOT_IMAGE=/kernel init=/init ro                                                                                                                                           
    DefaultUid    REG_DWORD    0x3e8                                                                                                                                                                          
    Flags    REG_DWORD    0x7                                                                                                                                                                                 
    DefaultEnvironment    REG_MULTI_SZ    HOSTTYPE=x86_64\0LANG=en_US.UTF-8\0PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\0TERM=xterm-256color               
                                                                                                                                                                                                      
```

### WSLディストリビューションのEXEのありか取得(アイコン用)

* TODO
* 取りあえずこんなところにあったりします

```cmd
%ProgramW6432%\WindowsApps\TheDebianProject.DebianGNULinux_1.0.0.0_x64__76v4gfsz19hv4\debian.exe
```

## WSL 用の Task 作成

* 以上を踏まえて作成するTaskはこんな感じになります

|項目名|値|備考|
|---|---|---|
|Name| `WSL::Debian` |。|
|Task Parameters(GuiArgs)| `-icon "%ProgramW6432%\WindowsApps\TheDebianProject.DebianGNULinux_1.0.0.0_x64__76v4gfsz19hv4\debian.exe"` |。|
|Commands(Cmd1) | `PATH=%ConEmuBaseDirShort%\wsl;%PATH%" &amp; %ConEmuBaseDirShort%\conemu-cyg-64.exe --wsl -cur_console:pm:/mnt --distro-guid {f94rn1-9e39-472f-bf6e-25802845f1fd70b85}` | 。 |

* Commandsのポイントは **--distro-guid** 後の中括弧の文字列。ここでGUIDを当てはめるとOK。その他は最新版のConemuを入れるとWSL用のデフォルト値が入るのですが、それの流用でOKです。
* Task Parametersのポイントは **アイコンにWSLのコンソールを立ち上げるEXEそのものパスを書く** というのがミソ。

## その他知っておくべきこと

### conemu-cyg-64.exe って？

### wslbridge って？

### 直接 ディストリビューションのEXE指定したら駄目なの？
* 以下の不具合が確認されているので、conemu-cyg-64.exe + wslbridge 経由で利用したほうが良いです。
    * vim等のエディタでカーソルが使えなくなる。
    * 一部特殊なキーの受付が使えなくなる。


* vimが使いにくくなるのは微妙ですよね…

* あと conemy-cyg-64.exe 経由のWSL接続だと「コンソールログ取得」が可能なので、自分はこの方法で繋いでいます。