かすみん日記

暇なときに何か喋ります

【macOS Monterey】codeコマンドを使えるようにする(Visual Studio Code)

Visual Studio Code(以下vscode)をターミナル上から起動するためのcodeコマンドを使えるようにします。

※以下はズルいので無しです:

alias code='open -a "Visual Studio Code"'

Windowsだとvscodeをインストールするだけで、codeコマンドにも自動でパスが通るようです。

なので、以下はmacOS(特にMonterey)の人向け内容です。

環境

% sw_vers
ProductName:    macOS
ProductVersion: 12.4    # Monterey
BuildVersion:   21F79

% code -v
1.62.3
ccbaa2d27e38e5afa3e5c21c1c7bef4657064247
x64

% date 
2022年 7月 4日 月曜日 06時44分03秒 JST

手順

まず、vscodeは事前にインストールしておいてください。

標準でcodeコマンドが使えないか確認(最新バージョンならできるかも):

% code
## -> 成功すればvscodeアプリが起動する

ダメだったら、コマンドが見つからないとエラーが出る:

% code
zsh: command not found: code

vscodeを起動して、cmd + shift + Pで表示される窓にshellと入力します。

表示されるサジェストから、codeコマンドをインストールします。

ターミナルを起動して、codeコマンドが使えればOK。

% code
## -> vscodeアプリが起動するハズ?

成功した人は以上、成功しなかった人は以下に続く。

pythonコマンドのパスが通ってない

私の環境では以下のようなエラーが出ました:

% code
/usr/local/bin/code: line 6: python: command not found
/usr/local/bin/code: line 10: ./MacOS/Electron: No such file or directory

pythonコマンドが見つからないということですが、macでは標準でpython 2系がインストールされていたような?

と思いましたが、Montereyではpythonが削除されたようです。

なので、pythonをインストールしていない人はインストールします。

※覚えてない人はwhereコマンドで探してみて下さい:

where python python2 python3

homebrewでインストールするなら:

brew install python@3.9

多分、/usr/local/Cellar/python@3.9/以下に、pipとかも含めてインストールされます。

また、おそらく、シンボリックリンク/usr/local/bin/python3が作られるはずです。

% where python3
/usr/local/bin/python3    <- たぶんこれ
/usr/bin/python3          <- こっちはXcodeでインスコされたやつ

リンク先はls -gols -l)で確認できる:

% ls -go /usr/local/bin/python3
lrwxr-xr-x  1   38  9 13  2021 /usr/local/bin/python3@ -> ../Cellar/python@3.9/3.9.7/bin/python3

以上でpythonのインストールは確認できたが、まだやることがある。

今、python3コマンドで、インストールしたpythonを実行できる環境にあるが、codeコマンド実行に失敗したときを思い出すと、以下のようなエラーであった:

python: command not found

つまり、code内で呼んでいるのは「python」コマンド。

なので、pythonコマンドでもインストールしたpythonが呼ばれるように、シンボリックリンクを作成する:

## ln -s リンク先 リンク元
ln -s ../Cellar/python@3.9/3.9.7/bin/python3 /usr/local/bin/python

第1引数で指定してるpythonの実行ファイル(あるいはシンボリックリンク)は、各自の環境に合わせて修正して下さい。

第2引数の方は、シンボリックリンクのファイルですが、ファイル名は必ずpythonとし、配置する場所はパスが通っているところであればどこでも良いです。

以上で、任意ディレクトリからpythonコマンドが利用できるので、codeコマンドも実行できるようになっているはずです。

% code
## -> 今度こそvscodeアプリが起動するハズ

codeコマンドの中身

vscodeのコマンドパレットからcodeコマンドをインストールすると、/usr/local/bin/code/Applications/Visual Studio Code.app/Contents/Resources/app/bin/codeシンボリックリンクが作られるようです。

% ls -go /usr/local/bin/code
lrwxr-xr-x  1   68  7  2 15:40 /usr/local/bin/code@ -> /Applications/Visual Studio Code.app/Contents/Resources/app/bin/code

そして、codeの実体はただのシェルスクリプトです。

中身は以下で全てです:

#!/usr/bin/env bash
#
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.

function realpath() { python -c "import os,sys; print(os.path.realpath(sys.argv[1]))" "$0"; }
CONTENTS="$(dirname "$(dirname "$(dirname "$(dirname "$(realpath "$0")")")")")"
ELECTRON="$CONTENTS/MacOS/Electron"
CLI="$CONTENTS/Resources/app/out/cli.js"
ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" --ms-enable-electron-run-as-node "$@"
exit $?

確かに、エラーメッセージ通り6行目でpythonコマンドを実行しています。 これが見つからなくてエラーが出ていました。

シンボリックリンクを作成する代わりに、codeファイル自体を弄っても対応できますが、まあ前者にしておきましょう。

試行錯誤:エイリアスじゃダメ

そもそも、私の環境ではpythonコマンドが使えました!

というのも、pythonという名前でエイリアスを作成していたんですよね:

alias python='/usr/local/bin/python3'

でも、これはzsh用の設定ファイル~/.zshrcにしか書いていませんでした。

codeで呼ばれるシェル(shebang)はbashなので、bash用の設定ファイル.bash_profileにもエイリアスを追加してみましたが、それでもダメでした。

結局、よくわからないのですが、エイリアスじゃダメっぽいです。

実際、codeのファイル内に直接aliasコマンドを書いてみましたが、それでもcommand not foundでした。

というわけで、このあたりの仕様がエイリアスシンボリックリンクの使い分け方になるのかなと思います。

余談:macpython

昔はmacOSに標準でpython 2系がインストールされていて、pythonコマンドが使えたはずです。

どうやらMontereyのバージョンからランタイムpythonが削除されたようです。

なので、これからは自分でインストールする必要があるようです。

おわりに

長くなりましたが以上です。

何でこんなに長いんでしょう。

参考

同様の内容の記事

maku.blog

qiita.com

qiita.com

macOS MontereyとランタイムPython

applech2.com

シェル

www-creators.com

penpen-dev.com