概要
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に頼りました)
#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を起動させます.
#!/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