[英]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.