从 Visual Studio Code 中打开自定义协议的 URL

Tho*_*ser 7 url visual-studio-code

在我们的软件中,我们使用自定义协议处理程序。该协议的 URL 如下所示:

xyz://foo/bar/action?SnVzdCBhIGR1bW15IHRleHQgZm9yIG15IFNPIFBvc3Q=
Run Code Online (Sandbox Code Playgroud)

当我在系统上的任何浏览器中输入此 URL 时,我们的软件都会正确处理它。现在,我想使用Alt+ 单击从 VS Code 中打开该 URL,就像使用https-Links 所做的那样。

不幸的是 VS Code 无法将其识别为 URL。有什么办法告诉它上面是一个可点击的URL吗?

Kiu*_*hnm 0

您可以编写 VS Code 扩展,在其中注册您自己的链接提供程序vscode.languages.registerDocumentLinkProvider。链接提供者将返回链接列表。

由于链接中不允许使用自定义协议,因此您可以使用“命令 URI”来代替。例如:

const args = encodeURIComponent(JSON.stringify({x: ..., y: ...}));
const link = new vscode.DocumentLink(
    range, vscode.Uri.parse(`command:helloworld.mycmd?${args}`)
));
Run Code Online (Sandbox Code Playgroud)

command:部分是固定的,而helloworld.mycmd是需要注册的命令

vscode.commands.registerCommand('helloworld.mycmd', myCmdHandler);
Run Code Online (Sandbox Code Playgroud)

您可以控制发送到命令的参数,并且可以在命令中执行任何操作,因此您可以使用xyz://以下shell函数直接调用与之关联的应用程序:

import * as cp from 'child_process';

function shell(cmd: string) {
    return new Promise<void>((res, rej) => {
        cp.exec(cmd, (err, stdout, stderr) => {
            console.log('--- stdout ---\n' + stdout);
            console.log('--- stderr ---\n' + stderr);
            if (err) {
                rej(err);
            } else {
                res();
            }
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

当然,请随意修改它。

编辑:您也可以让操作系统处理 URI。例如,在 Windows 上您可以执行 shell 命令start "" "xyz://..."。也许node.js 可以以一种更加独立于平台的方式做同样的事情。

希望我已经给了你足够的指导。您可以使用链接模式扩展的源代码作为起点。