[英]How to trigger activation of the vscode markdown extension
在我的 VS Code 扩展中,我有一些使用内置 Markdown 扩展的代码。 我通过注册为 markdown 插件并将以下代码放在我的扩展程序激活方法的末尾来捕获对它的引用。
return {
extendMarkdownIt(mdparam: any) {
return md = mdparam;
}
};
Markdown 在激活时调用它。
一般来说,这不是问题。 我的扩展的大多数用例涉及一个 markdown 文件已经加载到活动编辑器中,并且该文件的加载触发了 markdown 扩展的激活。
但是,在某些合法用例中并非如此。
我需要以编程方式触发 markdown 扩展的激活。 其中一些情况涉及在活动编辑器中打开不同类型的文件,因此将 markdown 文件加载到其中不是可接受的选项。
一些潜在的策略:
workbench.action.editor.changeLanguageMode
但没有文档。 我试过了vscode.commands.executeCommand('workbench.action.editor.changeLanguageMode', 'md');
但这会触发 UI
所以我尝试了一种我在其他命令的参数中看到的模式并添加了, true
。 这抑制了 UI,但似乎不起作用。
在这些选项中,我最喜欢的是 3,但我什至不知道这是否可能。 选项 1 受到 vscode 内部命令的蹩脚(在许多情况下不存在)文档的阻碍。
选项1是。 如果有人知道如何执行选项 3,请告诉,下面的解决方案是一个可怕的 hack。
通过将任何打开的编辑器的文档语言更改为 markdown,可以触发 Markdown 扩展的激活。 如果没有打开的编辑器,可以在 memory 中创建具有 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);
}
});
});
}
捕获完成后,我们可以恢复真实语言或酌情关闭编辑器。 实际上,第二种情况(没有活动编辑器)不太可能,因为我自己的扩展在您加载某些内容之前不会激活。 无论如何,它现在可以稳定运行。 更大的项目进展顺利。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.