VScode插件视图显示本地文件目录树

2023-11-10

前言
    最近工作中需要用到vscode开发插件,作为一个没用使过vscode开发插件的小白,发现官网的教程还是很详细的。另外还发现了一篇适合小白的博文(VScode插件开发全攻略(小铭同学)),大家也可以看看,写得很好。
    写这篇博文的目的是为了整理一下自己学的东西,毕竟记录和回想还是不一样的。

1.开发环境搭建

    这里给出需要用到的工具的下载地址,下载后直接安装就可以了,注意需要给node.js和Git设置环境变量。

  1. Node.js
    可以使用命令:npm root -g 查看全局包的存放地址。也可以修改全局包的存放地址,这里就不多说了。
  2. Git
  3. VS code
  4. 命令安装 Yeoman 和 VS Code Extension Generator:
    npm install -g yo generator-code
    安装的文件位置,在上面说到的全局包里面。
    Yeoman:一个脚手架工具,通过yeoman可以快速创建代码模板。需要配置环境变量,配好后可以查看版本信息:yo --version
    VS Code Extension Generator:VS Code的模板。

2.创建一个TypeScript项目

yo code
? What type of extension do you want to create? New Extension (TypeScript)
? What's the name of your extension? DirTreeDemo
? What's the identifier of your extension? dirtreedemo
? What's the description of your extension? DirTreeDemo
? Initialize a git repository? Yes
? Which package manager to use? npm
code dirtreedemo

    在编辑器中按下 F5 ,在新窗口中 Ctrl+Shift+P,输入命令 Hello World,会看到 Hello World from DirTreeDemo! 的通知。
    (强烈建议看官网教程,有操作视频视频)
在这里插入图片描述
    你也可以修改命令,或者修改通知的消息:
在这里插入图片描述在这里插入图片描述
注意: 可能按下 F5 后会报找不到js文件之类的错误,这是因为你的vscode不能直接将.ts文件编译成.js文件,这里 可能解决你的问题。

3.自定义视图容器

    添加一个视图容器,并给其添加两个视图。视图的图标,可以在 阿里巴巴矢量图标库 中下载。
在这里插入图片描述
    按下 F5 可以看到
在这里插入图片描述
    可以给视图标题的视图顶部和视图项上下文菜单添加一些嵌入式图标,并给其绑定一些命令事件,用来实现某些效果。
    在package.json的 contributes.menu 中:
        “view/title”:在视图标题中显示操作的位置。设置"group": “navigation”,则和标题同行显示,位于标题右边;不设置"group",则显示在标题同行最有边的 菜单中。
        “view/item/context”:显示树项目动作的位置。设置"group": “inline”,则和视图项同行显示,位于标题右边;不设置"group",则在 鼠标右键 时显示。
    嵌入式图标排序:默认package.json中的先后顺序,如需要更改,可以在在group的值的后边加上 @序号 ,如:“group”: “navigation@1”。

4.打开本地文件夹

    给 树视图测试-1 添加一个嵌入式图标,用来向用户显示“文件打开”对话框。

//package.json
{
	...
	"activationEvents": [
		"onView:TreeViewTest",//激活视图容器
		"onCommand:TreeViewTest_One.opendir"//激活命令
	],
	"contributes": {
		"commands": [
			{
				"command": "TreeViewTest_One.opendir",//定义一个命令
				"title": "打开文件夹",//鼠标停放时显示的信息
				"icon": {//设置显示图标
					"light": "images/open_light.svg",
					"dark": "images/open_dark.svg"
				}
			}
		],
		"viewsContainers": {
			"activitybar": [{//添加视图容器
				"id": "TreeViewTest",
				"title": "我的目录树",
				"icon": "images/person.svg"
			}]
		},
		"views": {
			"TreeViewTest": [//给视图容器添加视图
				{
					"id": "TreeViewTest_One",
					"name": "树视图测试-1"
				},
				{
					"id": "TreeViewTest_TWO",
					"name": "树视图测试-2"
				}
			]
		},
		"menus": {
			"view/title": [{
					"command": "TreeViewTest_One.opendir",
					"when": "view == TreeViewTest_One",//控制此操作只在视图 TreeViewTest_One 中生效
					"group": "navigation"//显示视图标题的右边,同行显示
				}]
		}
	},
	...
}

    注册命令 TreeViewTest_One.opendir ,为命令编写执行操作:

//extension.ts
...
export function activate(context: vscode.ExtensionContext) {
	...
	//注册命令 TreeViewTest_One.opendir
	context.subscriptions.push(vscode.commands.registerCommand('TreeViewTest_One.opendir', () => {
		let options = {
			canSelectFiles: false,		//是否可选择文件
			canSelectFolders: true,		//是否可选择目录
			canSelectMany: false,		//是否可多选
			defaultUri: vscode.Uri.file("D:/VScode"),	//默认打开的文件夹
			openLabel: '选择文件夹'
		};
		//向用户显示“文件打开”对话框,允许用户选择用于打开目的的文件。
		vscode.window.showOpenDialog(options).then(result => {
			if(result === undefined){
				vscode.window.showInformationMessage("can't open dir.");
			}
			else{
				vscode.window.showInformationMessage("open dir: " + result.toString());
			}
		});
	}));
}
...

5.处理树数据并显示到视图

    vscode提供了很多API,这里用到:
        TreeItem:class,用来处理视图项item,可以给其绑定命令,设置提示信息等。
        TreeDataProvider:interface,处理树数据。必须实现的方法:

  • getTreeItem(element: T): TreeItem | Thenable :返回给定element或根的子代(如果未传递任何元素)。
  • getChildren(element?: T): ProviderResult<T[]> :返回在视图中显示的元素的UI表示形式(TreeItem)。
//myTreeData.ts
import { TreeDataProvider, TreeItem, TreeItemCollapsibleState, ProviderResult, window } from "vscode";
import * as  fs from "fs";
import * as path from "path";

export class MyTreeData implements TreeDataProvider<MyTreeItem>{
    constructor(private rootPath: string){
    }

    getTreeItem(element: MyTreeItem) : MyTreeItem | Thenable<MyTreeItem> {
        return element;
    }

    getChildren(element?: MyTreeItem | undefined): ProviderResult<MyTreeItem[]>{
        if(!this.rootPath){
            window.showInformationMessage('No file in empty directory');
            return Promise.resolve([]);
        }
        if(element === undefined){
            return Promise.resolve(this.searchFiles(this.rootPath));
        }
        else{
            return Promise.resolve(this.searchFiles(path.join(element.parentPath, element.label)));
        }
    }
    //查找文件,文件夹
    private searchFiles(parentPath: string): MyTreeItem[] {
        var treeDir: MyTreeItem[] = [];
        if(this.pathExists(parentPath)){
            var fsReadDir = fs.readdirSync(parentPath, 'utf-8');
            fsReadDir.forEach(fileName => {
                var filePath = path.join(parentPath, fileName);//用绝对路径
                if(fs.statSync(filePath).isDirectory()){//目录
                    treeDir.push(new MyTreeItem(fileName, parentPath, TreeItemCollapsibleState.Collapsed));
                }
                else{//文件
                    treeDir.push(new MyTreeItem(fileName, parentPath, TreeItemCollapsibleState.None));
                }
            });
        }
        return treeDir;
    }   
    //判断路径是否存在
    private pathExists(filePath: string): boolean{
        try{
            fs.accessSync(filePath);
        }
        catch(err){
            return false;
        }
        return true;
    }
}

export class MyTreeItem extends TreeItem{
    constructor(
        public readonly label: string,      //存储当前标签
        public readonly parentPath: string,   //存储当前标签的路径,不包含该标签这个目录
        public readonly collapsibleState: TreeItemCollapsibleState
    ){
        super(label, collapsibleState);
    }
    //设置鼠标悬停在此项上时的工具提示文本
    get tooltip():string{
        return path.join(this.parentPath, this.label);
    }
    //为每项添加点击事件的命令
    command = {
        title: "this.label",
        command: 'MyTreeItem.itemClick',
        arguments: [    //传递两个参数
            this.label,
            path.join(this.parentPath, this.label)
        ]
    };
    contextValue = 'MyTreeItem';//提供给 when 使用
}

    修改 extension.ts 文件:

...
import { MyTreeData } from './myTreeData';
export function activate(context: vscode.ExtensionContext) {
	...
	//注册命令 TreeViewTest_One.opendir
	context.subscriptions.push(vscode.commands.registerCommand('TreeViewTest_One.opendir', () => {
		let options = {
			canSelectFiles: false,		//是否可选择文件
			canSelectFolders: true,		//是否可选择目录
			canSelectMany: false,		//是否可多选
			defaultUri: vscode.Uri.file("D:/VScode"),	//默认打开的文件夹
			openLabel: '选择文件夹'
		};
		vscode.window.showOpenDialog(options).then(result => {
			if(result === undefined){
				vscode.window.showInformationMessage("can't open dir.");
			}
			else{
				//vscode.window.showInformationMessage("open dir: " + result.toString());
				//TODO: 这里 URI 转本地路径,暂时先这样,以后再改
				var loadUri = result[0].path.toString();
				var loadDir = loadUri.substr(1, loadUri.length);
				vscode.window.showInformationMessage("open dir: " + loadDir);
				vscode.window.registerTreeDataProvider('TreeViewTest_One', new MyTreeData(loadDir));
			}
		});
	}));
	//注册命令 MyTreeItem.itemClick
	context.subscriptions.push(vscode.commands.registerCommand('MyTreeItem.itemClick', (label, filePath) => {
		//TODO:可以获取文件内容显示出来,这里暂时只打印入参
		console.log("label : " + label);
		console.log("filePath : " + filePath);
	}));
}
...

    按 F5 ,可以把这个项目目录导入进去,得到:
在这里插入图片描述

6.给视图项添加嵌入式图标

//package.json
{
	...
	"activationEvents": [
		...
		"onCommand:TreeViewTest_One.item.add",
		"onCommand:TreeViewTest_One.item.delete"
	],
	"contributes": {
		"commands": [
			...
			{
				"command": "TreeViewTest_One.item.add",
				"title": "添加",
				"icon": {
					"light": "images/add_light.svg",
					"dark": "images/add_dark.svg"
				}
			},
			{
				"command": "TreeViewTest_One.item.delete",
				"title": "删除",
				"icon": {
					"light": "images/delete_light.svg",
					"dark": "images/delete_dark.svg"
				}
			}
		],
		...
		"menus": {
			"view/item/context": [
				{//直接显示在右侧
					"command": "TreeViewTest_One.item.add",
					"when": "view == TreeViewTest_One && viewItem == MyTreeItem",
					"group": "inline"
				},
				{//鼠标右击后显示
					"command": "TreeViewTest_One.item.delete",
					"when": "view == TreeViewTest_One && viewItem == MyTreeItem"
				}
			]
		}
	},
}
...

    注册命令

//function activate 中 添加
//注册命令 TreeViewTest_One.item.add
	context.subscriptions.push(vscode.commands.registerCommand('TreeViewTest_One.item.add', () => {
		//TODO:你想要执行的操作,这里只弹出信息
		vscode.window.showInformationMessage('add');
	}));

	//注册命令 TreeViewTest_One.item.delete
	context.subscriptions.push(vscode.commands.registerCommand('TreeViewTest_One.item.delete', () => {
		//TODO:你想要执行的操作,这里只弹出信息
		vscode.window.showInformationMessage('delete');
	}));

    执行结果:
在这里插入图片描述

7.问题

  • 如何让视图中目录的右键事件和文件的右键事件不一样?
        目录和文件分别实现treeItem即可。
  • 如何设置视图中,空白处(非视图item处)的右键点击事件?
    希望有大佬可以给我解惑,谢谢。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VScode插件视图显示本地文件目录树 的相关文章

  • STL算法之排序

    stl 算法库中提供的排序相关算法主要有以下几种 除了 q sort 定义在 cstdlib 头文件中 其余都定义在 algorithm 头文件 算法 功能 sort 排序 stable sort 稳定排序 保证等值情况时的原有顺序 par
  • 【C++】教大家在七夕new一个对象

    new是啥 new 是C 的关键字之一 它一般用来在堆上创建对象 但它与一般的创建对象的方法不同 它在创建对象时 会返回这个对象的指针 堆是啥 还有 和栈有什么区别 栈是由编译器自动分配和释放的 一般存放函数的参数值 局部变量的值等 速度较
  • c++primer 第十七章笔记 01tuple类型

    tuple类型 tuple看作一个 快速而随意 的数据结构 三个成员都设置为0 tuple
  • flowable实战(四):构建命令行程序

    实际上前面那些都是前置知识 真正上手的话其实还是一脸懵的情况 这里我也是按照文档生成一个最简单的demo 这个demo就是一个简单的Maven工程 你只要启动main方法就可以看到效果 github实例代码地址 这里如果直接下载代码 如果不
  • TCP的乱序和丢包判断(附Reordering更新算法)-实例case

    写前一篇文章TCP的乱序和丢包判断 附Reordering更新算法 理论的时候 我觉得我在一边拉一边吃 玩的都是排泄物 言之无味 不知所云 我想把一些能看得见摸得着的东西独立出来 就成了本文 如果有一天我忘掉了TCP的细节 我想我直接把本文
  • ADB无线连接/wifi调试 安卓设备

    一般 对android设备使用adb命令前 需要先用数据线连接设备后 才可以继续使用 此篇文章 我们来讲另外一种android设备的连接方式 无线连接 一 无线连接设置的具体步骤如下 第一步 先用USB数据线 将手机和电脑连接在一起 1 数
  • Python兼职接单也能月入过万,整理了70个练手的小项目,赶快学起来

    下面是一些的python兼职单子截图 心动了吗 快去抓紧时间学习起来吧 上述这份完整版的Python全套学习资料已经上传CSDN官方 朋友们如果需要可以直接划到文末免费领取 保证100 免费 关于Python技术储备 学好Python 不论
  • SpringSecurity学习笔记(一)springSecurity的整体架构

    参考视频 编程不良人 1 什么是SpringSecurity 首先我们要知道SpringSecurity是Spring家族中的一员 是基于spring框架提供的一套web应用安全性的完整解决方案 包括可高度定制的认证 授权 鉴权等一系列的流
  • 元宇宙沉浸式互动展示系统开发定制平台

    2021年公认是元宇宙元年 今年元宇宙的发展更是得到了社会各界的广泛关注 元宇宙首次被写入地方 十四五 规划 各大数字科技巨头 政府机构也都纷纷入局元宇宙 随着元宇宙的变现能力和商业化前景已经得到证实 元宇宙概念与广告营销业的深度融合优势开
  • 计算机毕业设计ssm基于java语言的自行车在线租赁系统k22rh9 (附源码)轻松不求人

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 ssm mybatis Ma
  • Java 自定义注解及使用场景

    Java自定义注解一般使用场景为 自定义注解 拦截器或者AOP 使用自定义注解来自己设计框架 使得代码看起来非常优雅 本文将先从自定义注解的基础概念说起 然后开始实战 写小段代码实现自定义注解 拦截器 自定义注解 AOP 一 什么是注解 A
  • 小程序+uniapp部分问题

    微信小程序showModal中content的内容如何换行 在需要换行的位置加上 r n 即可实现内容的换行 注 微信开发者工具可能看不到效果 但是真机实测是会换行的 wx showModal title 提示 content 未达到最低使
  • 百度云加速配置SSL证书方法

    配置前提 确保域名在HTTP普通网站可以正常打开 并且域名已经解析到百度加速 一 登录沃通数字证书商店下载 SSL证书文件并且解压 选择nginx文件夹 百度云加速只需要用到nginx文件夹 二 登录百度云加速 https su baidu
  • 子系统 Arch Linux

    去年 还是前年不记得了 微软推出了子系统 官方支持的是Ubuntu 由于我对Ubuntu这样的重量级Linux没啥好感 当时只是安装了一下 就没怎么玩了 现在又有机会重新安装了Win10 去年在Arch社区得知Github上有关于Arch子
  • java Json转string方法

    Java中Json转string方法 Java利用Json lib包进行json对象转换成string JSONArray转换string方法实例 public static void main String args throws JSO
  • springboot配置类编写

    以配置一个DataSource为例 其他的类似 接下来我就给大家介绍具体步骤 1 首先写两个类 并添加注解 ConfigurationProperties 表明这是一个配置类 其中一个为dataSource的配置类 一个为jdbc的配置类
  • 为什么docker容器启动不了?

    sudo docker run d centos bin bash创建容器之后 使用docker ps a 发现容器已经停止 再使用docker start id 启动容器之后 观察ps a 的操作时间 发现容器其实已经启动过 但是马上就停
  • wsl 修改 hostname

    我在使用Windows 的 wsl 功能的时候发现在默认情况下 wsl 的 hostname 是和当前 windows 系统的主机名称保持一致的 当我尝试使用 hostname 修改主机名时 发现并不能完全修改 在重新进入后又会恢复成原来的
  • IDEA忽略文件,防止git提交不想提交的文件的探索

    使用IDEA开发有 一段时间了 从陌生到熟悉的过程算是很平稳的度过 感谢IntelliJ IDEA交流群 群号244908708 里面的群友对我提供的帮助 感谢群主的github上面提供的资料 这篇文章是探索git忽略文件提交的一些方面的研

随机推荐

  • 麦克风音频服务器未响应,耳机和麦克风都没坏,插上电脑后为什么不能语音聊天?...

    耳机和麦克风都没坏 插上电脑后为什么不能语音聊天 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 耳机和麦克风都没坏 插上电脑后为什么不能语音聊天 先确认你的电脑
  • 第十七章 Chisel基础——数据类型

    一 Chisel的常见问题 在学习Chisel前 应该熟悉一些常见问题 这些问题在编写Chisel的任何时候都应该牢记 Chisel是寄宿在Scala里的语言 所以它本质还是Scala 为了从Chisel转变成Verilog 语言开发人员开
  • 径向基神经网络(RBF)回归预测MATLAB实现超详细

    在机械学习算法的过程中 我们常用到一种神经网络就是径向基神经网络 这是一种使用径向基函数作为激活函数的人工神经网络 这种神经网络也有很多用途 比如时间序列预测 数据分类以及回归预测等等 今天主要讲解径向基神经网络在MATLAB的实现过程 对
  • 003_linux驱动之_file_operations函数

    一 解析file operations函数 解析002 linux驱动之 register chrdev注册字符设备中的问题 二 file operations结构原型 使用举例 三 从上面的原型可以看出file operations函数有
  • 不走索引的情况

    1 条件字段选择性弱 查出的结果集较大 不走索引 2 where条件等号两边字段类型不同 不走索引 3 优化器分析的统计信息陈旧也可能导致不走索引 4 索引字段 is null 不走索引 5 对于count 当索引字段有not null约束
  • nn.Conv2d——二维卷积运算解读

    PyTorch学习笔记 nn Conv2d 二维卷积运算解读 nn Conv2d 二维卷积运算 代码案例 一般用法 输出卷积运算的参数 填充方式 零填充 镜像填充 复制填充 循环填充 官方文档 nn Conv2d 二维卷积运算 torch
  • Could not load 'clearsilver-jni' java.library.path = out/host/linux-x86/lib make: *** [out/target/common/docs/api-stubs-timestam

    Could not load clearsilver jni java library path out host linux x86 lib make out target common docs api stubs timestamp
  • 关于C++代码中中文字符的错误或者乱码的解决办法

    在文件头加入下面这段内容 pragmaexecution character set utf 8 如果还不行就同时用Notepad 等一些工具转换成utf 8的编码 如不出意外已经解决问题了
  • Halcon卡尺测量

    halcon之机器视觉测量 卡尺测量 read image ImageModel image png get image size ImageModel Width Height dev open window 0 0 Width Heig
  • 内网信息收集-入门概念

    内网信息收集 在内网渗透测试环境中 有很多设备和防护软件 例如Bit9 ArcSight Mandiant 等 它们通过收集目标内网的信息 洞察内网网络拓扑结构 找出内网中最薄弱的环节 信息收集的深度 直接关系到内网渗透测试的成败 1 内网
  • 树莓派4b刷入openwrt做旁路由

    你需要准备 树莓派4b主板 1 tf卡 16GB 1 tf卡读卡器 Win32DiskImager软件 1 首先下载符合树莓派4b的openwrt固件 由于目前官方暂未提供 此处需要自行编译 2 以管理员运行方式打开Win32DiskIma
  • 1.认识多态 2.多态调用成员的特点 3.多态优势与弊端

    1 多态前提是有继承关系 并且有方法的重写 2 创建多态对象 Fu f new Zi 等号左边父 右边子 1 多态调用成员变量 调用的就是 Fu f new Zi Fu的 2 多态调用成员方法 调用的就是 被覆盖掉的父类 也就是子类 1 多
  • 通过终端上传文件至github

    1 打开终端 config自己的name和email git config global user name 使用者名称 git config global user email 邮箱 2 建立本地git仓库 cd到你的本地项目根目录 就是
  • python3 open()函数调用方法简单示例

    python3 open 函数调用简介 Python open 方法用于打开一个文件 并返回文件对象 在对文件进行处理过程都需要使用到这个函数 如果该文件无法被打开 会抛出 OSError 注意 使用 open 方法一定要保证关闭文件对象
  • Windows 下使用 grub2 制作美观的维护U盘

    本来是想用 grub4dos 的 但是那个的界面比较难看 于是就找到了 grub 就有了这篇文章 这篇文章主要针对 BIOS UEFI 可能不适用 预览 这是最终效果 实用工具子菜单 工具提取自老毛桃PE 当然也可以自己从其他地方找 文件管
  • iframe加载页面,onload函数不执行的问题

    前一阵子 做了个小工具 其中用到了一个隐藏的iframe结果出现了一个奇怪的现象 iframe加载的页面本来有一个onload来进行初始化的 结果这个onload函数指定的初始化代码并没有被执行 同时使用document getElemen
  • 线代【解方程组】--猴博士爱讲课

    第六课 解方程组 1 6判断方程组解的情况 判断方程组的解的情况 齐次唯一解例题 非齐次无解例题 非齐次有解例题 2 6解方程组 解方程组 共有五步 求增广矩阵的秩 变换矩阵 R 3 就变换前三行 前三列 为单位矩阵的形式 根据 得到的矩阵
  • 如何让HFSS仿真结果跟随当前optimization选中的参数组变化

    如何让HFSS仿真结果跟随当前optimization选中的参数组变化 我们经常使用HFSS优化参数 可以得到多组结果 一般来说 我们希望我们的图表显示当前这一组参数对应的S参数 这样当我们在optimization中应用不同组参数时 可以
  • 概率论考点之方差及数学期望

    如题 2019年10月 分析 由方差的性质 详见4 D 2x 1 D 2x 0 4D x 10 所以D x 2 5 答案选B 在此之前 不知什么是方差 1 什么是方差呢 可以说是建立在数学期望基础上的概念 什么是数学期望呢 详见扩展 关于数
  • VScode插件视图显示本地文件目录树

    前言 最近工作中需要用到vscode开发插件 作为一个没用使过vscode开发插件的小白 发现官网的教程还是很详细的 另外还发现了一篇适合小白的博文 VScode插件开发全攻略 小铭同学 大家也可以看看 写得很好 写这篇博文的目的是为了整理