🛠️

VS Codeからsshしたサーバーでcodeコマンド叩いた時にホスト側で新規windowが立ち上がって欲しい

に公開2

結論

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

yuunag1yuunag1

vscodeなんて使うな。負荷上がってサーバー落ちるだろ(環境によっては)っていう意見もあるかもしれない