現已釋出!閱讀關於 11 月新增功能和修復的內容。

虛擬文件

文字內容提供程式 API 允許您從任意來源在 Visual Studio Code 中建立只讀文件。您可以在以下位置找到包含原始碼的示例擴充套件:https://github.com/microsoft/vscode-extension-samples/blob/main/virtual-document-sample/README.md

TextDocumentContentProvider

此 API 的工作原理是宣告一個 URI 方案,然後您的提供程式將返回該方案的文字內容。註冊提供程式時必須提供該方案,並且之後無法更改。同一個提供程式可用於多個方案,並且單個方案可以註冊多個提供程式。

vscode.workspace.registerTextDocumentContentProvider(myScheme, myProvider);

呼叫 registerTextDocumentContentProvider 會返回一個可釋放物件,透過該物件可以撤消註冊。提供程式只需實現 provideTextDocumentContent 函式,該函式在呼叫時會帶有一個 URI 和取消令牌。

const myProvider = new (class implements vscode.TextDocumentContentProvider {
  provideTextDocumentContent(uri: vscode.Uri): string {
    // invoke cowsay, use uri-path as text
    return cowsay.say({ text: uri.path });
  }
})();

請注意,提供程式不會為虛擬文件建立 URI - 它的作用是在給定此類 URI 的情況下**提供**內容。作為回報,內容提供程式被連線到開啟文件邏輯中,因此提供程式始終會被考慮。

此示例使用一個“cowsay”命令來製作一個編輯器應顯示的 URI

vscode.commands.registerCommand('cowsay.say', async () => {
  let what = await vscode.window.showInputBox({ placeHolder: 'cow say?' });
  if (what) {
    let uri = vscode.Uri.parse('cowsay:' + what);
    let doc = await vscode.workspace.openTextDocument(uri); // calls back into the provider
    await vscode.window.showTextDocument(doc, { preview: false });
  }
});

該命令提示輸入,建立 cowsay 方案的 URI,為該 URI 開啟一個文件,最後為該文件開啟一個編輯器。在第 3 步(開啟文件)中,系統會要求提供程式為該 URI 提供內容。

有了這個,我們就擁有了一個功能齊全的文字內容提供程式。接下來的部分描述瞭如何更新虛擬文件以及如何為虛擬文件註冊 UI 命令。

更新虛擬文件

根據情況,虛擬文件可能會更改。為了支援這一點,提供程式可以實現一個 onDidChange 事件。

vscode.Event 型別定義了 VS Code 中事件處理的約定。實現事件的最簡單方法是 vscode.EventEmitter,如下所示

const myProvider = new (class implements vscode.TextDocumentContentProvider {
  // emitter and its event
  onDidChangeEmitter = new vscode.EventEmitter<vscode.Uri>();
  onDidChange = this.onDidChangeEmitter.event;

  //...
})();

事件發射器有一個 fire 方法,可用於在文件發生更改時通知 VS Code。更改的文件透過作為引數傳遞給 fire 方法的 URI 來標識。然後,提供程式將被再次呼叫以提供更新後的內容,前提是文件仍處於開啟狀態。

這就是讓 VS Code 監聽虛擬文件更改所需的一切。要檢視使用此功能的更復雜的示例,請檢視:https://github.com/microsoft/vscode-extension-samples/blob/main/contentprovider-sample/README.md

新增編輯器命令

可以新增僅與關聯內容提供程式提供的文件互動的編輯器操作。這是一個反轉奶牛所說內容的示例命令

// register a command that updates the current cowsay
subscriptions.push(
  vscode.commands.registerCommand('cowsay.backwards', async () => {
    if (!vscode.window.activeTextEditor) {
      return; // no editor
    }
    let { document } = vscode.window.activeTextEditor;
    if (document.uri.scheme !== myScheme) {
      return; // not my scheme
    }
    // get path-components, reverse it, and create a new uri
    let say = document.uri.path;
    let newSay = say
      .split('')
      .reverse()
      .join('');
    let newUri = document.uri.with({ path: newSay });
    await vscode.window.showTextDocument(newUri, { preview: false });
  })
);

上面的程式碼片段檢查我們是否有一個活動的編輯器,以及它的文件是否屬於我們的方案。需要進行這些檢查,因為命令對每個人都可用(且可執行)。然後,URI 的路徑部分被反轉並從中建立一個新的 URI,最後開啟一個編輯器。

要新增編輯器命令,需要在 package.json 中新增一個宣告性部分。在 contributes 部分中新增此配置

"menus": {
  "editor/title": [
    {
      "command": "cowsay.backwards",
      "group": "navigation",
      "when": "resourceScheme == cowsay"
    }
  ]
}

這引用了在 contributes/commands 部分中定義的 cowsay.backwards 命令,並表示它應該出現在編輯器標題選單中(右上角的工具欄)。現在,僅僅這樣意味著該命令始終顯示,對於每個編輯器都是如此。這就是 when 子句的用途 - 它描述了必須滿足什麼條件才能顯示該操作。在此示例中,它宣告編輯器中文件的方案必須是 cowsay 方案。然後為 commandPalette 選單重複該配置 - 預設情況下它顯示所有命令。

cowsay-bwd

事件和可見性

文件提供程式是 VS Code 中的一等公民,它們的內容出現在常規文字文件中,它們使用與檔案相同的基礎設施等。但是,這也意味著“您的”文件無法隱藏,它們將出現在 onDidOpenTextDocumentonDidCloseTextDocument 事件中,它們是 vscode.workspace.textDocuments 的一部分等等。每個人的規則是檢查文件的 scheme,然後決定是否要對該文件執行某些操作。

檔案系統 API

如果您需要更大的靈活性和能力,請檢視 FileSystemProvider API。它允許實現一個完整的檔案系統,包括檔案、資料夾、二進位制資料、檔案刪除、建立等等。

您可以在以下位置找到包含原始碼的示例擴充套件:https://github.com/microsoft/vscode-extension-samples/tree/main/fsprovider-sample/README.md

當 VS Code 在此類檔案系統的資料夾或工作區上開啟時,我們稱之為虛擬工作區。當虛擬工作區在 VS Code 視窗中開啟時,這會透過左下角遠端指示器中的標籤顯示,類似於遠端視窗。請參閱 虛擬工作區指南,瞭解擴充套件如何支援此設定。

© . This site is unofficial and not affiliated with Microsoft.