まったりするmatayu

ツイートにゴミがついた感じのブログ

vscodeのcodeコマンド

Codeコマンド

vscode を使っている人であれば打ったことがあるであろうcodeコマンド

実はbinaryじゃなくてshellscriptが見れる

shellscriptがそのままあることもあるんだなぁ

$which code
/usr/local/bin/code
$cat /usr/local/bin/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" "$@"
exit $?

realpath

dirname

  • ディレクトリのパスを返す
  • 知らないコマンドがまだまだたくさんあるね
$dirname ~/ws/notes/blog
/Users/matac/ws/notes

$?

直前のプロセスの終了ステータス

exit $?

終了ステータス$?を返して終了する

debugしてみる

$zsh -x /usr/local/bin/code .
+/Users/matac/.zshenv:1> source /Users/matac/.cargo/env
+/Users/matac/.cargo/env:4> case :/Users/matac/.nvm/versions/node/v14.16.1/bin:/Users/matac/.pyenv/shims:/Users/matac/.pyenv/bin:/Users/matac/.rbenv/shims:/usr/local/opt/openssl@1.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/go/bin:/Users/matac/.cargo/bin:/usr/local/go/bin:/Users/matac/ws/go/bin:/Applications/Julia-1.6.app/Contents/Resources/julia/bin: (*:/Users/matac/.cargo/bin:*)
+/usr/local/bin/code:7> CONTENTS=+/usr/local/bin/code:7> realpath /usr/local/bin/code
+realpath:0> python -c 'import os,sys; print(os.path.realpath(sys.argv[1]))' realpath
+/usr/local/bin/code:7> CONTENTS=+/usr/local/bin/code:7> dirname /Users/matac/realpath
+/usr/local/bin/code:7> CONTENTS=+/usr/local/bin/code:7> dirname /Users/matac
+/usr/local/bin/code:7> CONTENTS=+/usr/local/bin/code:7> dirname /Users
+/usr/local/bin/code:7> CONTENTS=+/usr/local/bin/code:7> dirname /
+/usr/local/bin/code:7> CONTENTS=/ 
+/usr/local/bin/code:8> ELECTRON=//MacOS/Electron 
+/usr/local/bin/code:9> CLI=//Resources/app/out/cli.js 
+/usr/local/bin/code:10> ELECTRON_RUN_AS_NODE=1 //MacOS/Electron //Resources/app/out/cli.js .
/usr/local/bin/code:10: no such file or directory: //MacOS/Electron
+/usr/local/bin/code:11> exit 127

マジで何やってるのかわからん

$ls -la /usr/local/bin/code
lrwxr-xr-x  1 matac  admin  68  3 28 20:50 /usr/local/bin/code@ -> /Applications/Visual Studio Code.app/Contents/Resources/app/bin/code

実体はここにある

[~/ws/notes/blog]
$zsh /usr/local/bin/code .
/usr/local/bin/code:10: no such file or directory: /Users/matac/MacOS/Electron
[~/ws/notes/blog]
$bash /usr/local/bin/code . 

zshじゃなくてbashなら行けるっぽい(bashって書いてあるやろがい!)

[~/ws/notes/blog]
$bash -x /usr/local/bin/code .
++++++ realpath /usr/local/bin/code
++++++ python -c 'import os,sys; print(os.path.realpath(sys.argv[1]))' /usr/local/bin/code
+++++ dirname '/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code'
++++ dirname '/Applications/Visual Studio Code.app/Contents/Resources/app/bin'
+++ dirname '/Applications/Visual Studio Code.app/Contents/Resources/app'
++ dirname '/Applications/Visual Studio Code.app/Contents/Resources'
+ CONTENTS='/Applications/Visual Studio Code.app/Contents'
+ ELECTRON='/Applications/Visual Studio Code.app/Contents/MacOS/Electron'
+ CLI='/Applications/Visual Studio Code.app/Contents/Resources/app/out/cli.js'
+ ELECTRON_RUN_AS_NODE=1
+ '/Applications/Visual Studio Code.app/Contents/MacOS/Electron' '/Applications/Visual Studio Code.app/Contents/Resources/app/out/cli.js' .
+ exit 0

なのでcodeコマンドは最終的に '/Applications/Visual Studio Code.app/Contents/MacOS/Electron' '/Applications/Visual Studio Code.app/Contents/Resources/app/out/cli.js' . を実行している

'/Applications/Visual Studio Code.app/Contents/MacOS/Electron'

vscodeを開くコマンド

'/Applications/Visual Studio Code.app/Contents/Resources/app/out/cli.js'

[~/ws/notes/blog]
$cat '/Applications/Visual Studio Code.app/Contents/Resources/app/out/cli.js'
"use strict";const bootstrap=require("./bootstrap"),bootstrapNode=require("./bootstrap-node"),product=require("../product.json");bootstrap.avoidMonkeyPatchFromAppInsights(),bootstrapNode.configurePortable(product),bootstrap.enableASARSupport(void 0),process.env.VSCODE_CLI="1",require("./bootstrap-amd").load("vs/code/node/cli");

//# sourceMappingURL=https://ticino.blob.core.windows.net/sourcemaps/054a9295330880ed74ceaedda236253b4f39a335/core/cli.js.map

後ろにディレクトリを指定してあげるとvscodeでそのディレクトリを開ける動きをするはず

めっちゃ長い1 line code

vscodeのフロントまでたどり着いたっぽい

bootstrap はフロントエンドライブラリ

ちょっと見辛いので改行入れてみた(あんまり改行できなかった)

"use strict";

const bootstrap=require("./bootstrap"),bootstrapNode=require("./bootstrap-node"),product=require("../product.json");

bootstrap.avoidMonkeyPatchFromAppInsights(),bootstrapNode.configurePortable(product),bootstrap.enableASARSupport(void 0),process.env.VSCODE_CLI="1",require("./bootstrap-amd").load("vs/code/node/cli");

requireでモジュールbootstrap, bootstrapNode, productを読み込んでいる 最後にvs/code/node/cliがloadされている。見に行ったらとてつもなく長い1 line codeがあった。

このくらいにしておこう...

build and debug

https://github.com/microsoft/vscode/wiki/How-to-Contribute

buildしてcodeしたときの動きをdebugすると面白そう

ブラウザでも開けるのか

webアプリケーションって思ったよりも大きい括りかもしれない

webブラウザvscodeが立ち上がってる不思議な感覚

f:id:mattari_matayu:20210527113757j:plain
webブラウザで立ち上がっているvscode

debugはappとして起動しながらやろう

いろいろ準備して./scripts/code.shで起動できる

多分これがcodeコマンドに相当するはず

./scripts/code.sh ~/ws/notesとやったら~/ws/notesが起動後に開かれた

  • これ自体はcodeコマンドとは別物みたい

ソースをみに行ったら、しっかりインデントがついたコードが見れた

GitHub - microsoft/vscode: Visual Studio Code

$resources/darwin/bin/code.sh .
resources/darwin/bin/code.sh: line 10: /Users/matac/ws/src/github.com/microsoft/vscode/MacOS/Electron: No such file or directory

これがcodeコマンドだろうけど、パスがずれてるっぽくてうまく動かない

実機の場合は

/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code

debug環境は

/Users/matac/ws/src/github.com/microsoft/vscode/resources/darwin/bin/code.sh

ちょっといじらないとcodeコマンドのdebugができない...?