何を言ってるんだ?
タイトルが何を言ってるかわからないと思うので、まずは環境の説明。
私は自宅のマシン(macOS)をモリモリスペックにして自宅ではそのマシンを、外出先ではノーパソからRemoteSSHを使って作業をしています。
作業環境を引き継げたり、外出先でコンパイルしてもバッテリー消費しなくて済むなどメリットがいろいろあります。
そしてVSCodeにはcode
というCLIからVSCodeを開けるコマンドがあるのですが、これが実は2種類存在します。
path | 説明 |
---|---|
ローカルのcodeコマンド ( /usr/local/bin/code ) |
ローカル環境で使うためのcodeコマンド。多くの人はこれ使ってるはず![]() |
RemoteSSH時のcodeコマンド ( ~/.vscode-server/bin/<hash>/bin/code ) |
リモート接続時に使うためのcodeコマンド。RemoteSSH時に使うことで、クライアントPCのVSCodeでワークスペースを開いてくれる。 (https://code.visualstudio.com/docs/remote/ssh#_opening-a-terminal-on-a-remote-host) |
何が問題なの?
で何が問題なのかというと、ローカルのcode
コマンドをインストールしてしまうと、/user/local/bin/
配下にインストールされるためエイリアスが上書きされます。
そうするとRemoteSSHで接続中にcodeコマンドを実行してもローカルのcodeコマンドが実行されてしまい、クライアントにしているノーパソのVSCodeには何も表示されません。
RemoteSSHは、サーバー(ワークステーションなど)のワークスペースを直接編集したりするのが一般的な使い方なんだと思います。
しかし私の場合はデスクトップマシンなので、リモート環境がローカル環境にもなり得るちょっと複雑な環境です。
デスクトップPCを直接使っているときはローカルのcodeコマンド
を、RemoteSSHしているときはリモート用のcodeコマンド
を実行してほしい!
というのが今回の問題です。
解決策
ローカルで使うcode
コマンドはアンインストールして、.zshrc
や.bashrc
などに以下のコードを追加するだけ。
# codeコマンドがRemote SSHと競合しないように、`/usr/local/bin/`にはインストールせず、環境分岐させる
if [ -z "$VSCODE_IPC_HOOK_CLI" ]; then
# ※macOSの場合↓↓↓
alias code='/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code'
fi
/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code
は、ローカルで実行するcodeコマンドのオリジナルです。
RemoteSSH時に使われる環境変数 $VSCODE_IPC_HOOK_CLI
が存在しない場合、すなわちローカルで実行するときは、アプリケーション内にあるcode
コマンドを直接実行します。
こうすることで/user/local/bin/
にcodeコマンドを置く必要がなくなり、エイリアスが上書きされるのを防げます。
終わり
実にニッチな要望だと思うのですが、備忘録として残しておきます。
次はiTermみたいなターミナルからcodeコマンド使いたい。昔からGithubとかで議論されているけど、良さげな方法が見つかっておらず……。