【VS Code插件开发】常见自定义命令(七)

news2024/11/24 20:32:10

🐱 个人主页:不叫猫先生,公众号:前端舵手
🙋‍♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀!
📢 资料领取:前端进阶资料可以找我免费领取
🔥 摸鱼学习交流:我们的宗旨是在「工作中摸鱼,摸鱼中进步」,期待大佬一起来摸鱼(文末有我wx或者私信)

在这里插入图片描述

目录

  • 1、获取文件路径
  • 2、刷新开发工具
  • 3、监听文件创建
  • 4、监听文件删除
  • 5、监听代码复制
  • 6、监听代码粘贴
  • 7、监听代码剪切
  • 8、获取package.json信息
  • 9、获取VS Code/电脑系统基本信息
  • 🌟「微信读书」VS Code插件推荐

本文介绍了在 VS Code 插件开发过程中常见的命令,后续会继续补充。

1、获取文件路径

在注册命令的回调中,是否存在uri,有的话直接得到文件路径uri.path

vscode.commands.registerCommand('extension.getCurrentFilePath', (uri) => {
			vscode.window.showInformationMessage(`当前文件(夹)路径是:${uri ? uri.path : '空'}`);
		})

2、刷新开发工具

开发插件时候需要刷新开发工具,操作步骤如下:

  • 注册刷新的命令
  • 关闭侧边栏
  • 打开自定义的视图
  • 打开开发工具
vscode.commands.registerCommand("extension.reloadSidebar", async () => {
			await vscode.commands.executeCommand("workbench.action.closeSidebar");
			await vscode.commands.executeCommand("workbench.view.extension.todolist-container");
			setTimeout(() => {
				vscode.commands.executeCommand(
					"workbench.action.webview.openDeveloperTools"
				);
			}, 500);
		})

3、监听文件创建

vscode.workspace.onDidCreateFiles用于监听文件创建事件,新创建的会被放入到event.files中。

		vscode.workspace.onDidCreateFiles((event) => {
			// 新增的文件
			const addedFiles = event.files;
			// 处理新增的文件
			addedFiles.forEach((file) => {
			//获取文件名
				const fileName = path.basename(file.fsPath);
				// 使用 path.extname() 截取文件名后面的字符串(即文件后缀)
				const fileExtension = path.extname(fileName).toLowerCase();
				//获取文件类型
				const fileType = fileExtension.substring(1);
			});
		})

4、监听文件删除

监听文件删除与监听文件创建类似,只是用的API不同,监听文件删除使用onDidDeleteFiles,删除的文件信息放到event.files

		vscode.workspace.onDidDeleteFiles((event) => {
			// 删除的文件
			const deletedFiles = event.files;
			deletedFiles.forEach((file) => {
				const fileName = path.basename(file.fsPath);
				// 使用 path.extname() 截取文件名后面的字符串(即文件后缀)
				const fileExtension = path.extname(fileName).toLowerCase();
				//获取文件类型
				const fileType = fileExtension.substring(1);
				
			});
		})

5、监听代码复制

通过执行文本编辑器命令registerTextEditorCommand,可以访问和操作文本编辑器的内容和状态。

vscode.commands.registerTextEditorCommand('extension.copyCommand', (textEditor, edit) => {
			const selection = textEditor.selection;
			// 获取选中的文本
			const selectedText = textEditor.document.getText(selection);
			// 将选中的文本存储到剪贴板
			vscode.env.clipboard.writeText(selectedText);
			//获取当前活跃的编辑器面板
			const activeTextEditor = vscode.window.activeTextEditor;
			let currentFilePath;
			if (activeTextEditor) {
			//获取当前路径
				currentFilePath = activeTextEditor.document.uri.fsPath;
				console.log(currentFilePath); // 输出当前文件的路径
			}
			// 获取选中文本的起始行和结束行,因为返回值的第一行是从0开始,所以这里加1
			const startLine = selection.start.line + 1;
			const endLine = selection.end.line + 1;
		}),

6、监听代码粘贴

通过执行registerCommand创建一个自定义的粘贴命令,将剪贴板中的文本粘贴到当前文本编辑器中的所选区域,并在粘贴后执行一些后续操创建一个自定义的粘贴命令,将剪贴板中的文本粘贴到当前文本编辑器中的所选区域,并在粘贴后执行一些后续操。监听代码粘贴,其实也就是重写了粘贴的逻辑,然后再获取粘贴的内容。

vscode.commands.registerCommand('extension.pasteCommand', () => {
           //获取当前活动的文本编辑器对象 
			const textEditor = vscode.window.activeTextEditor;
			if (!textEditor) {
				return;
			}
			//获取当前文本编辑器中的选择区域
			const selections = textEditor.selections;
			// 获取粘贴前的开始行号
			const originalStartLine = selections[0].start.line + 1; 
			// 获取粘贴前的结束行号
			const originalEndLine = selections[0].end.line + 1; 
			// 获取粘贴内容
			vscode.env.clipboard.readText().then((clipboardText) => {
				const edits: any[] = [];
				const filePath = textEditor.document.uri.fsPath;
				selections.forEach((selection) => {
					const startPosition = selection.start;
					const endPosition = selection.end;
					// 创建粘贴操作对应的编辑
					edits.push({
						range: new vscode.Range(startPosition, endPosition),
						newText: clipboardText,
					});
				});
				// 使用 Promise.all 等待所有编辑操作完成
				Promise.all(
					edits.map((edit) =>
						textEditor.edit((editBuilder) => {
							editBuilder.replace(edit.range, edit.newText);
						})
					)
				).then(() => {
					// 获取粘贴后的选择区域信息
					const newSelections = textEditor.selections;
					const newStartLine = newSelections[0].start.line + 1; // 获取粘贴后的开始行号
					const newEndLine = newSelections[0].end.line + 1; // 获取粘贴后的结束行号
				});
			});
		})

7、监听代码剪切

监听代码剪切,其实也是重写了剪切的逻辑,通过执行registerTextEditorCommand,可以访问和操作文本编辑器的内容和状态,然后在进行剪切时对代码进行处理。

vscode.commands.registerTextEditorCommand('extension.cutCommand', (textEditor, edit) => {
			const selection = textEditor.selection;
			// 获取被剪切的文本
			const cutText = textEditor.document.getText(selection);
			// 删除被剪切的文本
			edit.delete(selection);
			// 将剪切的文本存储到剪切板
			vscode.env.clipboard.writeText(cutText);
			//获取当前文件路径
			const activeTextEditor = vscode.window.activeTextEditor;
			let currentFilePath;
			if (activeTextEditor) {
				currentFilePath = activeTextEditor.document.uri.fsPath;
			// 获取选中文本的起始行和结束行
			const startLine = selection.start.line + 1;
			const endLine = selection.end.line + 1;
		}),

8、获取package.json信息

可以通过vscode.extensions.getExtension获取到扩展程序的引用,其中 ‘yourPublisher.yourName’ 应该被替换为你自己扩展程序的发布者和名称。具体来说,这个代码的目的是获取特定扩展程序的引用,以便在扩展程序内部执行操作或获取有关扩展程序的信息。

    let packageJSON = '';
    let extension = vscode.extensions.getExtension('yourPublisher.yourName');
	if (extension) {
		packageJSON = extension.packageJSON;
	} else {
		packageJSON = "";
	}

9、获取VS Code/电脑系统基本信息

获取操作系统名称、版本、VSCode版本、CPU型号、CPU核心数量和总物理内存,用于收集系统信息以用于日志记录、性能分析或任何需要了解运行环境的用途。

  • 使用 Node.js 的 os 模块的 platform 方法获取操作系统的名称。这将返回例如 “win32”(Windows)、“linux”(Linux)或 “darwin”(macOS)等字符串。
const os = require('os');
const osName = os.platform()
  • 使用 os 模块的 release 方法获取操作系统的版本信息。这通常是操作系统的版本号
const osVersion = os.release()
  • 获取 Visual Studio Code (VSCode) 的版本信息。这是通过访问 vscode 对象的 version 属性来实现的
const vscodeVersion = vscode.version
  • 使用 os 模块的 cpus 方法获取计算机的 CPU 信息数组,然后从数组中取出第一个 CPU 的型号信息
const cpu = os.cpus()[0].model
  • 同样使用 os 模块的 cpus 方法获取 CPU 信息数组,并通过数组的长度来获取计算机的 CPU 核心数量。
const cpuCores = os.cpus().length
  • 使用 os 模块的 totalmem 方法获取计算机的总物理内存(以字节为单位),然后将其转换为千兆字节 (GB)。
const totalPhysicalMemory = os.totalmem() / (1024 * 1024 * 1024);`

🌟「微信读书」VS Code插件推荐

插件市场搜索:WeChat Reading
注意:本插件只能阅读我的书架的图书,对于未加入到书架的图书不能进行阅读,所以只能通过其他方式比如PC、手机先把书加入书架后才能进行阅读。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/993821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java包装类简单认识泛型

1 包装类 在 Java 中,由于基本类型不是继承自 Object ,为了在泛型代码中可以支持基本类型, Java 给每个基本类型都对应了一个包装 类型。类中比如由属性/方法 使用比较方便 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 装包/装箱 : …

Linux使用docker安装elasticsearch-head

一、elasticsearch-head的安装启动 #下载镜像 docker pull alivv/elasticsearch-head #启动 docker run -d --name eshead -p 9100:9100 alivv/elasticsearch-head 查看日志 docker logs -f eshead 出现如下证明启动成功 浏览器访问9100端口,出现以下页面也说明…

java 线程安全问题 三种线程同步方案 线程通信(了解)

线程安全问题 线程安全问题指的是,多个线程同时操作同一个共享资源的时候,可能会出现业务安全问题。 下面代码演示上述问题,先定义一个共享的账户类: public class Account {private String cardId; // 卡号private double mone…

分布式版本控制工具——git

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——git ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很…

路由缓存问题 | vue-router的导航守卫

路由缓存问题 带参路由&#xff0c;当参数发生变化时&#xff0c;相同的组件实例将被复用&#xff0c;组件的生命周期钩子不会被调用&#xff0c;导致数据无法更新。 两种解决方法&#xff1a; 1. 给 RouterView绑定key值&#xff0c;即 <RouterView :key"$route.ful…

SpringBoot原理-自动配置-原理分析-源码跟踪

自动配置原理 SpringBootApplication 该注解标识在SpringBoot项目的启动类上&#xff0c;是SpringBoot中最为重要的注解&#xff0c;该注解由三个部分组成。 SpringBootConfiguration&#xff1a;该注解与Configuration注解作用一样&#xff0c;用来声明当前类为一个配置类Comp…

解决SVN文件不显示绿色小钩图标问题

问题描述&#xff1a; 今天重新安装了SVN&#xff0c;发现从中央服务器拉取文件到本地仓库后&#xff0c;对应的文件没有绿色的小钩图标&#xff0c;于是查了一下解决方案&#xff0c;在这里总结一下。 解决方案一&#xff1a; 原因&#xff1a;状态缓存设置问题造成的。 在…

2024年java面试--mysql(1)

系列文章目录 2024年java面试&#xff08;一&#xff09;–spring篇2024年java面试&#xff08;二&#xff09;–spring篇2024年java面试&#xff08;三&#xff09;–spring篇2024年java面试&#xff08;四&#xff09;–spring篇2024年java面试–集合篇2024年java面试–redi…

Java设计模式-结构性设计模式(代理设计模式)

简介 为其他对象提供⼀种代理以控制对这个对象的访问&#xff0c;属于结构型模式。客户端并不直接调⽤实际的对象&#xff0c;⽽是通过调⽤代理&#xff0c;来间接的调⽤实际的对象应用场景 各⼤数码专营店&#xff0c;代理⼚商进⾏销售对应的产品&#xff0c;代理商持有真正的…

算法训练营day46|动态规划 part08:完全背包 (LeetCode 139. 单词拆分、多重背包理论基础)

文章目录 139. 单词拆分 (求排列方法)回溯思路分析背包思路分析代码实现思考总结 多重背包理论基础 139. 单词拆分 (求排列方法) 题目链接&#x1f525;&#x1f525; 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多…

一文读懂LSTM及手写LSTM结构

torch.nn.LSTM是PyTorch中用于创建长短时记忆网络&#xff08;Long Short-Term Memory&#xff09;的类。LSTM是一种用于处理序列数据的循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;变体。 官方给出的LSTM API 文档 以下是 torch.nn.LSTM 的…

LORA项目源码解读

大模型fineturn技术中类似于核武器的LORA&#xff0c;简单而又高效。其理论基础为&#xff1a;在将通用大模型迁移到具体专业领域时&#xff0c;仅需要对其高维参数的低秩子空间进行更新。基于该朴素的逻辑&#xff0c;LORA降低大模型的fineturn门槛&#xff0c;模型训练时不需…

Redis-带你深入学习数据类型list

目录 1、list列表 2、list相关命令 2.1、添加相关命令&#xff1a;rpush、lpush、linsert 2.2、查找相关命令&#xff1a;lrange、lindex、llen 2.3、删除相关命令&#xff1a;lpop、rpop、lrem、ltrim 2.4、修改相关命令&#xff1a;lset 2.5、阻塞相关命令&#xff1a…

deepin V23通过flathub安装steam畅玩游戏

deepin V23缺少32位库&#xff0c;在星火商店安装的steam,打开报错&#xff0c;无法使用&#xff01; 通过flathub网站安装steam,可以正常使用&#xff0c;详细教程如下&#xff1a; flathub网址&#xff1a;主页 | Flathub 注意&#xff1a;flathub下载速度慢&#xff0c;只…

【笔试强训选择题】Day38.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言一、Day…

ChatGPT实战与私有化大模型落地

文章目录 大模型现状baseline底座选择数据构造迁移方法评价思考 领域大模型训练技巧Tokenizer分布式深度学习数据并行管道并行向量并行分布式框架——Megatron-LM分布式深度学习框架——Colossal-AI分布式深度学习框架——DeepSpeedP-tuning 微调 资源消耗模型推理加速模型推理…

基于SSM的学院实验中心管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

从数据页的角度看 B+Tree

InnoDB 是如何存储数据的&#xff1f; MySQL支持多种存储引擎&#xff0c;不同的存储引擎&#xff0c;存储数据的方式也不相同&#xff0c;我们最常使用的是 InnoDB 存储引擎。 在数据库中的记录是按照行来存储的&#xff0c;但是数据库的读取并不是按照 [ 行] 为单位&#x…

MySQL进阶 —— 超详细操作演示!!!(上)

MySQL进阶 —— 超详细操作演示&#xff01;&#xff01;&#xff01;&#xff08;上&#xff09; 一、存储引擎1.1 MySQL 体系结构1.2 存储引擎介绍1.3 存储引擎特点1.4 存储引擎选择 二、索引2.1 索引概述2.2 索引结构2.3 索引分类2.4 索引语法2.5 SQL 性能分析2.6 索引使用2…

BUUCTF rip 1

使用linux的file命令查看基本信息 64位 使用IDA64位进行反编译 看到gets就肯定有栈溢出 能看到有一个 _system函数&#xff0c;改函数能执行系统命令 既然反编译有这个函数说明有地方调用了他 果然在一个fun函数中有调用&#xff0c;执行的命令是 /bin/sh 也就是一个后门函数&…