从嵌入式终端获取VSCode实例ID



我有一个VSCode扩展,当我运行的程序遇到断点时,它会启动Python调试会话。然而,Python程序目前通过写入由扩展名监视的文件来与扩展名通信。

哈克,但它工作,除非我有两个实例的VSCode打开,他们竞相开始调试。

从VSCode的嵌入式终端运行的程序是否有任何方法来确定它在哪个VSCode实例中运行,以便扩展能够确定它是否连接到同一个实例?

你可以做到!官方的Git扩展必须做一些类似的事情来支持askpass。基本上,在扩展的activate()函数中,您可以执行以下操作:

export function activate(context: ExtensionContext) {
const ipcPath = getIpcPath(context);
context.environmentVariableCollection.replace("MY_EXTENSION_IPC_PATH", ipcPath);

这将在所有集成shell中设置一个环境变量,然后您的程序可以读取该变量。我怀疑如果您的分机按需激活可能会出现问题(我想只有在您的分机激活后,它才会适用于新的终端(,所以您可能需要在package.json中使用您的分机的activationEvents

要与扩展通信,可以使用IPC,但需要一个唯一的IPC路径。不幸的是,ExtensionContext中似乎没有任何唯一的标识符,所以我有点像这样黑了它:

let extensionInstance = 0;
function getIpcPath(context: ExtensionContext): string {
const hash = crypto.createHash("sha1");
hash.update(`${context.storageUri}${++extensionInstance}${process.pid}`);
const id = hash.digest("hex").slice(0, 10);
if (process.platform === "win32") {
return `\\.\pipe\my_extension_ipc_${id}`;
}
if (process.env["XDG_RUNTIME_DIR"] !== undefined) {
return path.join(process.env["XDG_RUNTIME_DIR"], `my_extension_ipc_${id}.sock`);
}
return path.join(os.tmpdir(), `my_extension_ipc_${id}.sock`);
}

这与Git扩展的功能非常相似。不太一样,但它似乎起作用了。

最后,我将IPC路径作为命令行参数传递给扩展的语言服务器,这样它就可以在该地址开始侦听了。

let serverOptions: ServerOptions = {
run: {
command: serverCommand,
args: ["--ipc-path", ipcPath],
},
debug: {
command: serverCommand,
args: ["--ipc-path", ipcPath, "--debug"],
},
};

看起来还可以!

最新更新