vscode插件开发入门案例-一键删除js文件中的某个函数

news2024/11/24 16:00:25

vscode插件开发入门案例-一键删除js文件中的某个函数

  • `vscode`插件开发入门案例-一键删除js文件中的某个函数
    • `demo`介绍
    • 准备工作
    • 插件开发
      • package.json介绍
      • extension.ts
    • 调试插件
    • 插件打包
    • 插件安装
    • 插件发布`vscode`应用市场

vscode插件开发入门案例-一键删除js文件中的某个函数

代码仓库地址:https://gitee.com/CandyWall/candy-web-study/tree/master/12、vscode插件开发

demo介绍

我这边准备开发一个vscode插件,用于删除js文件中的函数,先演示一下效果

在这里插入图片描述

参考链接:https://www.bilibili.com/video/BV1bG4y1n78A https://astexplorer.net

准备工作

官方为vscode的插件开发提供了一个代码生成器,可以通过交互的方式创建一个项目,使用如下命令安装这个代码生成器

npm install -g yo generator-code

安装完毕以后,在终端中输入,就可以进入交互式项目创建界面了

yo code

注:如果使用windowsPowerShell执行上面的命令,可能会报如下错误:

image-20221225171533591

导致此错误的原因是,PowerShell 执行策略,默认设置为Restricted,不加载配置文件或运行脚本。需变更设置为RemoteSigned,在PowerShell中执行命令set-ExecutionPolicy RemoteSigned更改 PowerShell 执行策略,过程中提示询问是否要更改执行策略?,选择 A 或 Y。然后再去执行yo code就不会报错啦。

交互式界面如下,按照提示输入即可,会自动生成一个项目,我这里选择的是typescript类型

image-20221225172029659

vscode打开这个项目

image-20221225172224229

插件开发

vscode插件开发过程中,最重要的就是package.jsonextendsion.ts,下面将对这两个文件进行介绍

package.json介绍

package.json中定义了插件功能触发的命令和时机,下面对重要的属性进行介绍:

"activationEvents": [
    "onCommand:vscode-extension-delete-function.helloWorld"
],
"main": "./out/extension.js",
"contributes": {
    "commands": [
        {
            "command": "vscode-extension-delete-function.helloWorld",
            "title": "vscode插件开发-删除函数"
        }
    ],
    "keybindings": [
        {
            "command": "vscode-extension-delete-function.helloWorld",
            "key": "ctrl+shift+D"
        }
    ]
},
  • main: 插件运行的入口文件为out目录下的extension.js
  • activationEvents: 表示插件触发的时机,onCommand表示在命令面板里面输入命令的时候会触发;
  • contributes:
    • commands 中默认定义了一条标题为vscode插件开发-删除函数command
    • keybindings中定义了这个command对应的快捷键,keywindows系统上的快捷键,macmacos系统上的快捷键。

定义好了这些属性以后,这就表示,我们做的插件后面可以通过打开命令面板(在最上面的查看菜单下点击,或者使用快捷键Ctrl +Shift+P),输入vscode插件开发-删除函数进行触发

image-20221225180532651

然后插件内部会调用out目录下的extension.js,所以我们插件要实现的功能代码应该写到extension.tsoutput下面extension.jsextension.ts编译后生成的文件)中。

下面介绍一下extension.ts

extension.ts

里面有个activate函数,插件被激活的时候会调用它,所以我们的逻辑就写到这个方法里面,直接上代码:

import * as vscode from 'vscode';
import {parse} from "@babel/parser";
import traverse from "@babel/traverse"

export function activate(context: vscode.ExtensionContext) {
	console.log('Congratulations, your extension "vscode-extension-delete-function" is now active!');

	let disposable = vscode.commands.registerCommand('vscode-extension-delete-function.helloWorld', () => {
		vscode.window.showInformationMessage('vscode插件开发-删除函数');

		// vscode中如何删除字符
		const editor = vscode.window.activeTextEditor;

		if(!editor) {
			return;
		}

		const code = editor.document.getText();
		const index = editor.document.offsetAt(editor.selection.active);

		const functionNode = getFunctionNode(code, index);

		if(!functionNode) {
			return;
		}

		editor.edit((editBuilder) => {
			editBuilder.delete(
				new vscode.Range(
					new vscode.Position(functionNode.start.line - 1, functionNode.start.column), 
					new vscode.Position(functionNode.end.line - 1, functionNode.end.column)
				)
			)
		});
	});

	context.subscriptions.push(disposable);
}

export function deactivate() {}

interface FunctionNode {
	name: string;
	start: {
		line: number;
		column: number;
		index: number;
	};
	end: {
		line: number;
		column: number;
		index: number;
	}
}

function getFunctionNode(code: string, index: number) : FunctionNode | undefined {
	let functionNode;
	const ast = parse(code);

	traverse(ast, {
		FunctionDeclaration(path) {
			if(index >= path.node?.start! && index <= path.node?.end!) {
				functionNode = {
					name: path.node?.id?.name,
					start: path.node?.loc?.start,
					end: path.node?.loc?.end
				};
			}
			
		}
	})

	return functionNode;
}

这里需要用到@babel库的parsertraverse,在终端中使用如下命令安装

npm install @babel/parser @babel/traverse
npm i --save-dev @types/babel__traverse

尝试编译一下这个项目,编译之前需要确保已经装了typescript环境,可以通过输入tsc -v打印版本号的方式确认;没有安装的话,使用下面的命令进行安装:

# 使用国内镜像:
npm config set registry https://registry.npmmirror.com
# 安装 typescript:
npm install -g typescript

安装好typescript环境以后,进入到项目根目录下,使用命令npm run compile对项目中的ts代码进行编译,编译后的js文件会放在output目录下

调试插件

准备好开发环境并且开发完插件代码,就可以进入下一步,插件调试了,按F5或者界面点击运行和调试,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UJQ5v6uP-1672076943788)(http://jp88.top/image/image-20221226001336132.png)]

就可以弹出一个新的vscode界面了,并且这个新的界面里面默认是装上了刚才开发的插件的,打开命令面板(在最上面的查看菜单下点击,或者使用快捷键Ctrl +Shift+P),输入刚才package.json里面command标题vscode插件开发-删除函数,可以检索出我们自己开发的插件的命令。

image-20221227002634034

回车或者鼠标点击执行一下,可以看到打开的js文件中的add函数被删除了,到此这个插件就开发完毕。

注意:如果这里搜不到我们自己写的插件的触发命令,请按照如下2点进行排查(这里非常坑,笔者在这里耗了两个小时排查,才最终发现了问题)。

  1. package.json中配置的vscode版本太高了,我默认是1.73.1,然后降到1.69.0OK

    image-20221226005520395

  2. 项目下生成了README.md文件,而README.md文件中引用的图片链接不是https的,这也会导致问题。所以解决办法是,把图片中不是http的图片链接替换成https的,或者删除图片,甚至可以考虑把README.md文件从项目中移除,避免后面再出现这样的问题。

插件打包

插件我们已经开发出来了,该如何打包呢,需要先安装打包命令,使用如下命令安装

npm install -g vsce

然后再使用

vsce package

运行的过程中如果报错,将会在项目的根目录下生成一个vsix文件,这个文件我们就可以分享给别人了。

image-20221227003326627

插件安装

我们开发好的插件应该怎么安装到vscode中呢,在扩展里面找到从VSIX安装,然后选择打包出来的vsix文件即可(注意:vscode版本号需要大于等于插件的package.json中定义的vscode的版本号)。

image-20221227003734732

插件发布vscode应用市场

有些小伙伴可能还想把自己的插件发布到应用市场,跟我们常用的插件一样,可以支持其他用户通过搜索下载安装,可以参考这篇博客:https://blog.csdn.net/qq_41581588/article/details/127006486,这里就不做赘述了。

到此这个vscode插件开发的小案例就结束了,有问题可以评论区留言探讨哦。

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

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

相关文章

数据分析之excel和finebi报表可视化对比

当我们拿到数据&#xff0c;想对数据实现可视化报表设计。第一步就是要了解什么是数据可视化分析&#xff0c;且数据可视化分析的方法有什么&#xff1f;而且当我们拿到excel表格的数据&#xff0c;第一个想法是excel表格自身实现报表数据可视化&#xff0c;除了用excel本身实现…

微信小程序 | 小程序组件化开发

&#x1f5a5;️ 微信小程序 专栏&#xff1a;小程序组件化开发 &#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; ✨ 个人主页&#xff1a;CoderHing的个人主页 &#x1f340; 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ &#x1f44…

梦想绽放CEO熊文:停产单一VR产品,VST将成为VR行业标配

很久没在北京参加线下活动了&#xff0c;真不容易。今天奇遇VR正式发布了消费级双目全彩VST VR设备&#xff1a;奇遇Dream MIX。会后&#xff0c;我还参加了梦想绽放CEO熊文的群访&#xff0c;从中了解到更多消息。 奇遇Dream MIX 关于奇遇Dream MIX这款产品&#xff0c;我开始…

【苹果iMessage相册推信息推】那些新功效理当可以或许压倒您。保护用户隐私是苹果的起点之一

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

如何从小白起步成为百万博主|配音运营工具必不可少

从新手做短视频&#xff0c;无论你是抖音还是快手&#xff0c;掌握一些视频运营工具&#xff0c;能让我们日常工作事半功倍以下是我做短视频三年来&#xff0c;一直都在使用的工具&#xff0c;从视频素材剪辑软件音效配音&#xff0c;满足了我日常运营的需求&#xff0c;新手也…

Windows Defense Mechanism - Part 1

Overview If I’m a long-time CTF player (or HackTheBox lab machine player), things are gonna go a little off when I’m put into a real world scenario - meaning that, when facing a well defended Windows machine. This article will summarize the main Window…

基于Java(Struts2 框架)+Mysql实现(Web)学生成绩管理系统【100010053】

学生成绩信息管理系统 Summary JavaWeb 课程设计作品。类似学校的教务管理系统&#xff0c;实现了其中的部分功能&#xff0c;包括学生的增删改查&#xff0c;成绩的增删改查等。 Note 关于数据库 数据库名称&#xff1a;smxy_class字符集&#xff1a;UTF-8先建立数据库&am…

Zookeeper下载、本地模式安装、集群操作

目录 1、Zookeeper下载地址 2 、本地模式安装 2.1安装前准备 2.2配置修改 2.3操作 Zookeeper 2.4配置参数解读 3、集群操作 3.1 集群安装 3.2 ZK 集群启动停止脚本 4、客户端命令行操作 4.1、命令行语法 4.2、znode 节点数据信息 4.3点类型&#xff08;持久/短暂…

【案例教程】基于现代R语言【Tidyverse、Tidymodel】的机器学习方法与案例分析实践技术应用

【点击观看视频】基于现代R语言【Tidyverse、Tidymodel】的机器学习方法与案例分析实践技术应用 机器学习已经成为继理论、实验和数值计算之后的科研“第四范式”&#xff0c;是发现新规律&#xff0c;总结和分析实验结果的利器。机器学习涉及的理论和方法繁多&#xff0c;编程…

【Unity篇】Unity入门介绍

目录 游戏引擎 Unity3D特点 窗口介绍 快捷键 创建工程 组件的获取 游戏引擎 程序的框架:一款游戏最最核心的代码。 包含以下系统:渲染系统&#xff0c;物理引擎&#xff0c;碰撞检测系统&#xff0c;音效&#xff0c;脚本引擎&#xff0c;动画系统&#xff0c;人工智能…

全志V85x芯片 Tina Linux RISC-V E907核心开发指南

全志V85x芯片 Tina Linux RISC-V E907核心开发指南 1 编写目的 介绍v85X 上E907 的启动环境和AMP 的环境搭建。 2 使用范围 全志V85X 系列芯片 3 环境 A7 SDK&#xff1a;Tina E907 SDK&#xff1a;melis 4 SDK 快捷命令说明 这里主要介绍几个下文会用到的命令&#xf…

【嵌入式项目开源】基于ESP32的墨水屏桌面小屏幕

首先简要介绍一下这个项目&#xff1a; 这个项目的开源主要包括硬件&#xff0c;固件和软件两部分&#xff0c;外壳后面如果做了也会开源出来。该项目主要是参考了以下教学视频。 链接&#xff1a;桌面小屏幕实战教学 其中硬件部分改动不大&#xff0c;主要是把USB驱动改成了Ty…

推荐系统从入门到入门(1)——推荐系统综述与协同过滤

本系列博客总结了不同框架、不同算法、不同界面的推荐系统&#xff0c;完整阅读需要大量时间&#xff08;又臭又长&#xff09;&#xff0c;建议根据目录选择需要的内容查看&#xff0c;欢迎讨论与指出问题。 目录 系列文章梗概 系列文章目录 一、问题背景介绍 1.推荐算法与…

企业拥有PMO(项目管理办公室)的好处

PMO&#xff08;项目管理办公室&#xff09;&#xff0c;是一个企业内定义和维护项目管理标准的办公室或部门。PMO为项目的执行提供指导和标准。他们创造切实的目标&#xff0c;与整个企业的愿景保持一致&#xff0c;并确保所有目标的实现。 PMO指导以项目模板、标准化流程、…

DoIP协议概述

大家好哈&#xff0c;我是穿拖鞋的汉子&#xff01; 伴随着需求不断提升&#xff08;车身数据传输速率和带宽需求&#xff09;&#xff0c;为了满足需求将以太网引进到车载网络中。车载以太网在诊断传输层的应用协议是ISO 13400&#xff08;Diagnostic On IP—DoIP&#xff09;…

模型实战(1)之YOLOv5 实现目标检测+训练自己的数据集

模型实战&#xff08;1&#xff09;之YOLOv5 实现目标检测训练自己的数据集 写一个小总结吧&#xff0c;关于yolov5使用可以参考我的两外两篇博文&#xff1a; 1.YOLOV5算法一之Windows10下yolov5安装测试并训练自己的数据集 2.YOLOV5算法二之数据集转换及自动划分训练集与测试…

代理模式之提出问题和代理模式的概念

代理模式之提出问题和代理模式的概念 1. 提出问题 ①现有代码缺陷 针对带日志功能的实现类&#xff0c;我们发现有如下缺陷&#xff1a; 对核心业务功能有干扰&#xff0c;导致程序员在开发核心业务功能时分散了精力 附加功能分散在各个业务功能方法中&#xff0c;不利于统一…

docker创建带有用户密码认证和web可视化界面的私有仓库

docker-registry的搭建 有时候使用Docker Hub这样的公共仓库可能不方便&#xff0c;用户可以创建一个本地仓库供私人使用。比如&#xff0c;基于公司内部项目构建的镜像。 docker-registry是官方提供的工具&#xff0c;可以用于构建私有的镜像仓库。 安装运行docker-registry…

Go语言设计与实现 -- 上下文

我们先来看一下context.Context的接口&#xff1a; // A Context carries a deadline, a cancellation signal, and other values across // API boundaries. // // Contexts methods may be called by multiple goroutines simultaneously. type Context interface {// Deadl…

【TypeScript】TS接口类型(三)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…