首页 > 解决方案 > 使用 TreeDataProvider 中的“vscode.open”命令

问题描述

编写 vscode 扩展时如何从自定义树视图项中打开文件?这是一个示例树视图项:

import { URI } from 'vscode-uri';
import { TreeDataProvider, ProviderResult, TreeItem } from 'vscode';

export class CustomTreeProvider implements TreeDataProvider<TreeItem>{

    public getChildren(element?: TreeItem): ProviderResult<TreeItem[]> {
        if (!element) {
            return [{
                id: 'some-unique-id',
                label: 'some-unique-label',
                command: {
                    command: 'vscode.open',
                    title: 'Open',
                    arguments: [URI.file('path/to/file']
                }
            }];
        }
    }

}

但是,每当我单击该树视图项时,它都会在控制台中失败并显示以下消息:

[renderer7] [error] 运行贡献的命令:'vscode.open' 失败。非法参数“资源” - 要打开的资源:错误:运行贡献的命令:“vscode.open”失败。非法参数“资源” - 要打开的资源

我有一个解决方法,我可以注册自己的自定义命令来打开文件,但如果可能的话,我宁愿使用内置的“vscode.open”命令。

标签: vscode-extensions

解决方案


问题是vscode.open命令不喜欢包Uri生成的vscode-uri。改为使用vscode.Uri

import { TreeDataProvider, ProviderResult, TreeItem, Uri } from 'vscode';

export class CustomTreeProvider implements TreeDataProvider<TreeItem>{

    public getChildren(element?: TreeItem): ProviderResult<TreeItem[]> {
        if (!element) {
            return [{
                id: 'some-unique-id',
                label: 'some-unique-label',
                command: {
                    command: 'vscode.open',
                    title: 'Open',
                    arguments: [Uri.file('path/to/file']
                }
            }];
        }
    }

}

推荐阅读