簡體   English   中英

vscode 擴展是否可以將 args 傳遞到命令 markdown 鏈接中?

[英]vscode extension is it possible to pass args into a command markdown link?

我正在使用HoverProvider開發一個 vscode 擴展,為MarkdownString提供一些 HTML 鏈接,鏈接本身是我自己的可以正常工作的命令(它們正在注冊並且它們的 function 命中)。 不幸的是,我無法將任何查詢字符串值/參數傳遞到命令 function 中。

是否可以通過 MarkdownString 傳遞參數,以便命令 function 接收它們?

package.json

{
  "name": "hover-command",

.. snip snip ...
 "contributes": {
    "commands": [
      {
        "command": "hover-command.say_hello",
        "title": "greetz"
      }
    ]
  },

extension.ts文件中

  context.subscriptions.push(
    vscode.commands.registerCommand("say_hello", async (hi: string) => {
      vscode.window.showInformationMessage(hi + ' greetz at ' + new Date());
    })
  );

and


  const selector: vscode.DocumentSelector = {
    scheme: "file",
    language: "*",
  };

  vscode.languages.registerHoverProvider(selector, {
    provideHover(
      doc: vscode.TextDocument,
      pos: vscode.Position,
      token: vscode.CancellationToken
    ): vscode.ProviderResult<vscode.Hover> {
      return new Promise<vscode.Hover>((resolve, reject) => {
        const hoverMarkup = "[Greetings...](command:say_hello?hi=world)";
        if (hoverMarkup) {
          const mdstring = new vscode.MarkdownString(hoverMarkup);
          mdstring.isTrusted = true; // NOTE: this is needed to execute commands!!
          resolve(new vscode.Hover(mdstring));
        } else {
          reject();
        }
      }
      );
    },
  });

但是注冊的命令 vscode.window.showInformationMessage沒有得到任何參數/查詢字符串值。 我試過查看arguments但仍然不知所措。

VSC源代碼中的幾個例子

[search the Marketplace](command:workbench.extensions.search?%22%40category%3A%5C%22scm%20providers%5C%22%22)

[Initialize Repository](command:git.init?%5Btrue%5D)

[configure](command:workbench.action.openSettings?%5B%22editor.formatOnSave%22%5D)

再次感謝@rioV8,經過幾次失敗的嘗試后,有幾個步驟可以獲取命令 hover markdown 鏈接以使用 arguments。

我正在使用TypeScript ,所以我將添加一個接口來定義args的形狀

interface ISayHelloArgs {
  msg: string;
}

注冊的命令然后使用這個接口(你得到一個單一的 object 'args')

  context.subscriptions.push(
    vscode.commands.registerCommand("say_hello", async (args: ISayHelloArgs) => {
      vscode.window.showInformationMessage(args.msg + ' greetz at ' + new Date());
    })
  );

注冊的HoverProvider然后使用JSON字符串的encodeURI版本構建args

 vscode.languages.registerHoverProvider(selector, {
    provideHover(
      doc: vscode.TextDocument,
      pos: vscode.Position,
      token: vscode.CancellationToken
    ): vscode.ProviderResult<vscode.Hover> {
      return new Promise<vscode.Hover>((resolve, reject) => {
        const args: ISayHelloArgs = { msg: 'hello' };
        const jsonArgs = JSON.stringify(args);
        const hoverMarkup = `[Greetings...](command:say_hello?${encodeURI(jsonArgs)})`;
        if (hoverMarkup) {
          const mdstring = new vscode.MarkdownString(hoverMarkup);
          mdstring.isTrusted = true; // NOTE: this is needed to execute commands!!
          resolve(new vscode.Hover(mdstring));
        } else {
          reject();
        }
      }
      );
    },
  });

這對我有用,希望對其他人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM