【问题标题】:How to trigger activation of the vscode markdown extension如何触发激活 vscode markdown 扩展
【发布时间】:2021-06-28 03:10:03
【问题描述】:

在我的 VS Code 扩展中,我有一些使用内置 Markdown 扩展的代码。我通过注册为 Markdown 插件并将以下代码放在扩展程序的激活方法末尾来捕获对它的引用。

  return {
    extendMarkdownIt(mdparam: any) {
      return md = mdparam;
    }
  };

Markdown 在激活时调用它。

通常这不是问题。我的扩展程序的大多数用例都涉及已加载到活动编辑器中的降价文件,并且加载此文件会触发降价扩展程序的激活。

但是有些合法的用例并非如此。

我需要以编程方式触发 markdown 扩展的激活。其中一些情况涉及在活动编辑器中打开不同类型的文件,因此将降价文件加载到其中是不可接受的选项。

一些潜在的策略:

  1. 更改语言模式。有一个命令workbench.action.editor.changeLanguageMode,但没有文档。我试过了
vscode.commands.executeCommand('workbench.action.editor.changeLanguageMode', 'md');

但这会触发 UI

所以我尝试了一种我在其他命令的参数中看到的模式并添加了, true。这抑制了 UI,但似乎不起作用。

  1. 将降价文件加载到新编辑器中,然后再次关闭它。这应该可以,但它
  2. 在我的扩展程序的贡献部分中添加一些内容,以更改 Markdown 扩展程序的激活触发器,以便由我的扩展程序运行的其他文件类型触发。

在这些选项中,我最喜欢 3 个,但我什至不知道这是否可能。选项 1 受到 vscode 内部命令的蹩脚(在许多情况下不存在)文档的阻碍。

【问题讨论】:

  • json 文件中的 Markdown 扩展需要什么?
  • @rioV8 渲染方法。
  • 如果您在其中一个编辑器中没有 Markdown 文件,如何呈现 Markdown
  • 我没有加载“降价”我正在加载 json 中列出的几个降价文件。这就是问题第一行所说的。多个文档,根据 json 文件中的元数据。文档是降价的。其中哪一部分是模棱两可的?
  • Markdown Render 是编辑器中 TextDocument 内容的 WebView(视图!),那么您想如何在没有编辑器的情况下呈现 Markdown。您是否使用字符串文档子句创建了一个无标题文档并将语言 ID 设置为 markdown

标签: visual-studio-code vscode-extensions


【解决方案1】:

选项 1 是。如果有人知道如何执行选项 3,请告诉,下面的解决方案是一个可怕的 hack。

可以通过将任何打开的编辑器的文档语言更改为 markdown 来触发 Markdown 扩展的激活。如果没有打开的编辑器,可以在内存中创建带有 markdown 语言集的文档并将其加载到编辑器中。

如果 VS Code 正忙于加载扩展,激活可能需要几百毫秒,所以最好的办法是观察 markdown-it 被捕获到的变量。

变量md 是一个全局变量(对于我的扩展来说是全局的,而不是整个 VS 代码),如问题所示,获取到其中的引用。

  let ed = vscode.window.activeTextEditor;
  if (ed) {
    let lid = ed.document.languageId;
    if (lid !== "markdown") {
      vscode.languages.setTextDocumentLanguage(ed.document, "markdown").then(
        function waitForMd() {
          if (md) {
            vscode.languages.setTextDocumentLanguage(ed!.document, lid);
          } else {
            setTimeout(waitForMd, 100);
          }
        }
      );
    }
  } else {
    vscode.workspace.openTextDocument({ language: "markdown" }).then(doc => {
      vscode.window.showTextDocument(doc).then(
        function waitForMd() {
          if (md) {
            vscode.commands.executeCommand("workbench.action.closeActiveEditor");
          } else {
            setTimeout(waitForMd, 100);
          }
        });
    });
  }

捕获完成后,我们可以恢复真实语言或酌情关闭编辑器。实际上,第二种情况(没有活动的编辑器)不太可能,因为我自己的扩展在您加载某些内容之前不会激活。无论如何,它现在可以稳定运行。更大的项目进展顺利。

【讨论】:

  • 什么是md(简称markdown)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
相关资源
最近更新 更多