Windows+WSL2+VScodeのRemote to WSL自動化

# 概要
Remote to WSLがめんどうくさかったし,ctrl+K,ctrl+Oでフォルダを開くことすらもめんどうくさかったのでコマンドで解決させました.

# 環境
* Windows11 Home
* WSL2(Ubuntu)
* VScode(Remote to WSL実装済)
(用追記)

# 結論
cmdやらubuntuやらのコマンドラインで次のようにたたけば自動でRemoteします.

```
code --remote wsl+ubuntu
```

+ubuntuの部分は,使用しているwslによります.Debianの人は+debianと叩いてみてください.

逆にRemoteをしたくない場合は,
```
code --remote  -r(-n)
```

と,空文字を送ることでremoteしなくなります.
空文字判定させるために,-rオプション等をつけるとより安定します.


以下はこれらのコマンドをもう少し使いやすくするためのコード実装です.

# Windows側から開く場合
要はコマンドラインに `code (ry`と打てればいいのです.
コンパイル後の実行が楽なc言語にやらせます.
ファイル名はわかりやすさとcodeが使えない(code.exeと被る)ことを考えて,
vscode.cとかにしましょう.
(cは不勉強なので一部chat-gに頼りました)
```c:vscode.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void run(char *a, char *b)
{
    char command[100];
    if (strcmp(a,"--remote=wsl+ubuntu")==0 && strcmp(b,"/home/uname")==0)
    {
        printf("Warning!!\nPath is uncorrect\nso using template\n");
        b = "C:/Users/uname";
    }
    sprintf(command, "code %s -r --folder-uri file:///%s", a, b);
    printf("%s\n", command);
    system(command);
    exit(0);
}

int main(int argc, char *argv[])
{
    char *OPT = "--remote=wsl+ubuntu";
    char *dir = "";

    if (argc == 1)
        run(OPT, "/home/uname");

    for (int i = 1; i < argc; i++)
    {
        if (strcmp(argv[i], "win") == 0 || strcmp(argv[i], "Windows") == 0)
            OPT = "--remote=";
        else if (strcmp(argv[i], "wsl") == 0 || strcmp(argv[i], "Ubuntu") == 0)
            OPT = "--remote=wsl+ubuntu";
        else if (strcmp(argv[i], "-dir") == 0 && i < argc - 1)
            dir = argv[i + 1];
        else if ((argv[i][0] == '/' || argv[i][0] == 'C') && dir[0] == '\0')
            dir = argv[i];
        else if (strcmp(argv[i], "home")==0)
        {
            //ディレクトリ設定
        }
        else if (strcmp(argv[i], "mnt") == 0 && strcmp(OPT, "--remote=wsl+ubuntu") == 0)
        {
            //以下使う可能性のあるコマンドライン引数を設定する
        }
    }
    if (dir[0] == '\0')
        dir = "/home/uname";
    run(OPT, dir);

    return 0;
}

```
第一引数でwindowsかwsl(Ubuntu),第二引数でディレクトリを指定できるようにしています.
指定がない場合のosやディレクトリの初期設定などはお好みで行ってください.

作成したexeファイルをpathの通ったフォルダにいれると,Win+Rキーでどこからでも実行できてより快適になります.

# WSL側から開く場合

同じくパスの通ったディレクトリに,こちらはバッシュで書いていきます.
WSLからRemoteを解除する場合,ファイルパスを指定するとうまくいかないので,
強引ですがcmd.exeからvscodeを起動させます.

```bash:vscode
#!/bin/bash 
OS="wsl"
DIR="/home/uname"

while [ "$#" -gt 0 ]; do
    case "$1" in
        Ubuntu | wsl )
		OS=wsl
        ;;
        Windows | win)
        OS=win
        ;;
        mnt )
        DIR=/mntdir
        ;;
        home | Home)
        if [ "$OS" == "wsl" ];then
        DIR=/home/uname
        elif [ "$OS" == "win" ];then
        DIR=C:/Users/uname
        fi
        ;;
        ...#以下欲しいだけ引数を設定する
        */*  )
        DIR=$1
        ;;
    esac
    shift
done

if [ "$OS" == "win" ];then
    echo "cmd.exe . /c code --remote== -r --folder-uri file:///$DIR"
    cmd.exe . /c code --remote= -r --folder-uri file:///$DIR &>/dev/null
    exit 0
fi

echo "code --remote=wsl+wbuntu -r --folder-uri file:///$DIR"
code --remote=wsl+wbuntu -r $DIR
```

動作確認をする場合,-rオプションを-nオプションに変えるとwindowを新しく作り見やすくなるので,それ用に``debug="-r"``のような変数を設定してもよいかもしれません.

# 終わりに

デバッグ情報募集しています.
参考:
vscodeのCLIについて
https://code.visualstudio.com/docs/editor/command-line
wslの実行
https://code.visualstudio.com/docs/remote/wsl#_getting-started