🛠️
VS Codeからsshしたサーバーでcodeコマンド叩いた時にホスト側で新規windowが立ち上がって欲しい
結論
remote先の.bashrcに以下を追加する。
# VSCode Remote: use server's code command instead of snap
# Prefer VSCode server's CLI over local snap version
# Fix 'code' command in VSCode Remote SSH sessions
if [ -n "$VSCODE_IPC_HOOK_CLI" ]; then
vscode_pid=$(lsof "$VSCODE_IPC_HOOK_CLI" 2> /dev/null | awk 'NR>1 {print $2}')
if [ -n "$vscode_pid" ]; then
vscode_bin=$(dirname $(readlink /proc/$vscode_pid/exe))/bin/remote-cli/code
[ -x "$vscode_bin" ] && alias code="$vscode_bin"
fi
fi
何で作ったの?
主な問題は表題通りです。
dockerだと立ち上がるので同じように立ち上がった方が便利だなあと思ったので。
仕組み
vscode-server経由で開いてる場合、以下の環境変数に値が存在します。
$ echo $VSCODE_IPC_HOOK_CLI
/run/user/1000/vscode-ipc-98425136-599c-4f95-a30f-06b1339289fb.sock
これはvscode-serverがhost側と通信するために管理しているソケットです。
この環境変数はhost側のterminalから普通にsshしただけとかだと存在しません。
流れとしてはこんな感じです。
続いて、pidを確認します。これはlsofで確認できます。
これが取れたら、codeコマンドのパスの作成に移ります。
ls ~/.vscode-server
が存在するはずです。remote接続してるなら。
cli code-994fd12f8d3a5aa16f17d42c041e5809167e845a extensions
code-94e8ae2b28cb5cc932b86e1070569c4463565c37 data
みるとなんか色々並んでると思います。今回必要になるのは、code-<hash>になってるところです。
このhashはvscodeのversionを表しています。
先ほどpidを調べたのは、このhashを合わせるためですね。
readlink /proc/$vscode_pid/exe
pidがわかるのでシンボリックリンクのシンク先、つまり実行ファイルパスを取得します。
取得したパスを元に、vscode-server内にあるcodeコマンドのパスを取得します。
これでやりたかったことができます。
注意
vscode側の変更によってこの仕組みが将来変わる可能性はゼロじゃないです。その時は合わせて変更してください。
Discussion
参考にしてね。
環境によって.vscode-server配下が違うとかあるのかもしれない。
vscodeなんて使うな。負荷上がってサーバー落ちるだろ(環境によっては)っていう意見もあるかもしれない