provideTextDocumentContent

provideTextDocumentContent

我在this示例之后编写Vscode FTP扩展名。

我的问题是,似乎每个文件provideTextDocumentContent仅被调用一次。再次打开文件不会调用该函数。相反,它只是向您显示已加载的内容。

请引用下面的代码:

public provideTextDocumentContent(uri: vscode.Uri, token: vscode.CancellationToken): vscode.ProviderResult<string> {
    console.log('uri.path');
    return this.model.getContent(uri).then(content => content);
}

这些是我在“ View ”上单击项目时的结果
log=> '/index.cfml'   // Clicked on index.cfml
log=> '/login.cfml'   // Clicked on login.cfml
log=>                 // Clicked on index.cfml
log=>                 // Clicked on login.cfml
log=> '/signup.cfml'  // Clicked on signup.cfml

预期结果将是:
log=> '/index.cfml'   // Clicked on index.cfml
log=> '/login.cfml'   // Clicked on login.cfml
log=> '/index.cfml'   // Clicked on index.cfml
log=> '/login.cfml'   // Clicked on login.cfml
log=> '/signup.cfml'  // Clicked on signup.cfml

如您所见,provideTextDocumentContent在我第一次单击某个项目时被调用,但是第二次单击同一项目却没有被调用。知道为什么会发生这种情况,或者我如何才能强制vscode每次点击调用它吗?

编辑:
我目前在数据提供者的顶部有一个onDidChange事件,但是实现可能是错误的。以下是我的数据提供者的外观摘要。
export class FtpTreeDataProvider implements vscode.TreeDataProvider<FtpNode>, vscode.TextDocumentContentProvider {

private _onDidChangeTreeData: vscode.EventEmitter<any> = new vscode.EventEmitter<any>();
readonly onDidChangeTreeData: vscode.Event<any> = this._onDidChangeTreeData.event;

constructor(private readonly model: FtpModel){ }

public refresh(): any {
    this._onDidChangeTreeData.fire();
}

public getTreeItem(element) {/*some code*/}
public getChildren(element) {/*some code*/}
public getParent(element) {/*some code*/}

public provideTextDocumentContent(uri: vscode.Uri, token: vscode.CancellationToken): vscode.ProviderResult<string> {
    console.log(uri.path);
    return this.model.getContent(uri);
}

最佳答案

只要打开文档,VS Code就会重复使用提供的内容。退出文档会关闭其编辑器,但会关闭文档本身。如果您完全关闭了文档(在所有选项卡中),则在打开新文档时应该会看到提供程序已被调用。

如果要更新现有文档的内容,请在onDidChange上实现TextDocumentContentProvider事件,并使用该事件表示VS Code应该调用provideTextDocumentContent

09-17 09:08