vscode-cats插件是如何开发的?小包带你来实现一下
前言
经过两个周的努力,昨天成功发布人生第一个插件 vscode-cats
,本文给大家介绍一下插件的开发过程,顺便也给自己做个记录。
插件下载: VSCode 扩展中直接搜索 vscode-cats 即可。
应用市场: vscode-cats
github: vscode-cats
如果能给 github
点个 star
就更完美了。
最开始开发 vscode-cats
时,感觉真的是暗无天日、遥遥无期。首先文档全是英文,看起来还是有几分吃力;二就是这种插件的模式实现 VSCode
并不提倡,因此 VSCode
官方并未提供类似的案例,但皇天不负有心人,多种方式去搜索、查询,终于查到了 background
插件(我感觉 background
插件的开发大佬很有可能是当前模式的先导者),后面又查到了 vscode-live2d
插件,通过钻研两位大佬的设计思路,终于最后成功做出 vscode-cats
插件。
环境准备
在开发 VSCode
插件之前,我们需要先安装两个依赖
- yeoman:
npm install -g yo
- generator-code:
npm install -g generator-code
初始化项目
进入要开发插件的目录,执行 yo code
指令,就会进入如下界面:
vscode-cats
插件使用的是 ts
开发,因此我们选择 New Extension (TypeScript)
,根据界面中要求操作,等到依赖安装完毕,插件 demo
项目初始化完毕。
初始化后的目录结构大致如下(只显示重要部分):
├── CHANGELOG.md // 版本更迭记录
├── README.md // 插件说明文档
├── src
│ └── extension.ts // 入口文件
├── package.json //
├── tsconfig.json // ts配置
├── test // 测试
核心文件介绍
学习 VSCode
插件开发,有两个特别重要的文件: package.json
extension.ts
,学会这两个文件后,就能进行简单的 VSCode
插件开发。
package.json
package.json
声明插件和命令的配置文件,用来注册命令等配置。
package.json
有很多字段属性可以配置,这里我就简介几个比较重要的配置。
activationEvents 属性
扩展的活动事件数组,在那些情况下事件会被激活。
demo
中配置的时 onCommand
指令,通过命令可以触发
"activationEvents": ["onCommand:demo.helloWorld"
],
插件中使用的是 “*” ,所有类型的事件都可以触发激活
"activationEvents": ["*"
],
关于 activationEvents
更详细的配置: https://code.visualstudio.com/api/references/activation-events
contributes 配置贡献点
常用的有 command
、configuration
等。
command
与活动事件列表里的 onCommand
指令相对应,在这里配置完毕后,就可以通过命令进行访问。
demo
中配置如下:
"commands": [{"command": "demo.helloWorld","title": "Hello World"}
]
configuration
configuration
配置的属性会在 setting.json
中和 VSCode
插件设置页面通过 UI
格式显示。
撸猫插件给喵咪添加了下面的配置:
配置 | 描述 |
---|---|
vscode-cats.enabled
|
true:启用插件、false:禁用插件 |
vscode-cats.model
|
更换喵咪 |
vscode-cats.modelWidth
|
自定义喵咪宽度 |
vscode-cats.modelHeight
|
自定义喵咪高度 |
vscode-cats.moveX
|
自定义喵咪水平位置 |
vscode-cats.moveY
|
自定义喵咪垂直位置 |
vscode-cats.opacity
|
设置喵咪透明度 |
vscode-cats.position
|
设置喵咪左右定位 |
下面以两个属性举一下例子:
"configuration": [{"title": "喵咪配置","type": "Object","properties": {"vscode-cats.enabled": {"type": "boolean","default": true,"description": "是否启用喵咪"},"vscode-cats.model": {"type": "string","enum": ["tororo","hijiki"],"default": "tororo","description": "选那只喵咪"}},}
]
配置完毕后,就可以在 setting.json
和 UI
中看到属性
extension.ts
extension
文件为项目的入口文件,该文件中提供两个重要方法: active deactive
。
active
: 插件激活时执行的函数deactive
: 插件被销毁时调用的函数
export function activate(context: vscode.ExtensionContext) {// 这里的代码只会在插件激活时执行一次console.log('Congratulations, your extension "demo" is now active!');// 定义在 package.json 中的命令在这里定义// 提供 registerCommand 来注册实现代码// commandId 参数必须与 package.json 匹配let disposable = vscode.commands.registerCommand('demo.helloWorld', () => {// 当命令触发时,这里的代码执行// 显示提示信息框vscode.window.showInformationMessage('Hello World from demo!');});context.subscriptions.push(disposable);
}
// 插件停用时调用
export function deactivate() {}
vscode-cats 开发
上面简单介绍了 VSCode
插件开发中必须要了解的基本知识,有了这些知识做基础,接下来一起看一下 vscode-cats
的实现。
架构
首先来看一下 vscode-cats
插件的项目结构
- extension.ts: 项目入口
- FileType.ts: 文件类型(未修改过、hack过的旧版本、hack过的新版本)
- getHTML.ts: 获取能渲染喵咪的 workbench.html
- HTML.ts: 实现检查、替换、恢复 workbench.html
- originHTML: 删除插件,恢复 workbench.html 文件
- Home.ts: 项目的根文件
- uninstall.ts: 插件卸载
- utils: 工具函数
- version.ts: 插件版本
- vsHelp.ts: 封装 VSCode 自身的信息提示功能
实现思路
- 预备工作
- 通过
fs
模块获取到workbench.html
路径 - 编写读取文件内容
getContent
、更改文件内容saveContent
方法 - 封装信息提示框函数
showInfo
和提示信息并重启showInfoRestart
函数 - 通过
vscode.workspace.getConfiguration
获取到插件的配置项 - 将能实现喵咪的
HTML
代码添加到getHTML.ts
并且将配置项集成到HTML
中 - 将原来的
workbench.html
内HTML
代码保存到origin HTML.ts
中
- 通过
- 安装插件或激活插件:
- 编写
install
方法: 获取到config
信息,将config
信息传递给getHTML
,将生成的HTML
代码写入workbench.html
中 - 判断插件是否为第一次安装、旧版本,如果是,执行
install
方法
- 编写
- 卸载插件或关闭插件:
uninstall
: 从originHTML
获取到原来的HTML
代码,写入workbench.html
如何获取当前版本是否为新版本: 通过给 workbench.html 添加标识实现,例如当前插件添加的标识是
<!-- /*ext.${extName}.ver.${version}*/ -->
核心代码
- 获取
workbench.html
路径
const base = path.dirname(require.main.filename);
const filePath = path.join(base,"vs","code","electron-browser","workbench","workbench.html"
);
- 读写文件
export const saveContent = function (filePath, content: string): void {fs.writeFileSync(filePath, content, "utf-8");
};
export const getContent = function (filePath): string {return fs.readFileSync(filePath, "utf-8");
};
- 读取插件配置
let config = vscode.workspace.getConfiguration(this.configName);
- install
public install(refresh?: boolean): void {let lastConfig = this.config; // 之前的配置let config = vscode.workspace.getConfiguration(this.configName); // 当前用户配置// 1.如果配置文件改变到时候,当前插件配置没有改变,则返回if (!refresh && JSON.stringify(lastConfig) === JSON.stringify(config)) {return;}// 之后操作有两种:1.初次加载 2.配置文件改变// 2.两次配置均为,未启动插件if (!lastConfig.enabled && !config.enabled) {return;}// 3.保存当前配置this.config = config; // 更新配置// 4.如果关闭插件if (!config.enabled) {this.uninstall();vsHelp.showInfoRestart(this.extName + "已关闭插件,请重新启动!");return;}// 5.hack 样式// 自定义的样式内容let content = getNewHtml(config, this.extName, this.version).replace(/\s*$/,"");// 将插件的HTML写入 workbench.html 文件saveContent(this.filePath, content);vsHelp.showInfoRestart(this.extName + " 已更新配置,请重新启动!");}
- uninstall
private uninstall(): boolean {try {let content = renewHTML();saveContent(this.filePath, content);return true;} catch (ex) {return false;}
}
打包
打包的实现比较简单,安装 vsce
依赖包(npm install -g vsce
)。
之后通过 vsce package
就可以将插件打包成 vsix
文件。
最后就可以把 vsix
安装到 VSCode
中试一下是否可用。
发布
关于发布我就不多啰啰了,具体可以参考官方文档。
传送门: Publishing Extensions
但一定注意在
maketPlace
注册开发者时,需要翻墙,那个注册页面访问了谷歌。(血泪教训)
后语
伙伴们,如果大家感觉本文对你有一些帮助,给阿包点一个赞
vscode-cats插件是如何开发的?小包带你来实现一下相关推荐
- VScode+keil插件-取代keil开发不要太爽了
VScode+keil插件-取代keil开发不要太爽了 前言:之前几年开发都是使用的keil,所以基本所有工程都是keil的工程,一时间开发项目还不能及时转变使用HAL库开发(stm32cube-id ...
- oir 用image j打开的插件_Windows 上使用 VSCode Remote 插件进行远程开发
直到 VSCode remote-ssh 插件出来和我买了一台 NUC 机器之前,我一直在维护两套开发环境,一套防在公司的 CentOS 虚拟机上,另一套则是家里的 Windows 机器.因为代码同步 ...
- vscode自动补全插件c语言,一些提高开发效率的VSCode必备插件(分享),vscode代码补全插件...
一些提高开发效率的VSCode必备插件(分享)提高开发效率的虚拟代码的一些重要插件(分享),本文推荐一些VSCode插件来提高效率.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有帮助.Vis ...
- [VsCode] 开发所使用的VsCode的插件
vscode 的插件 必须 Chinese (Simplified) Language Pack for Visual Studio Code Markdown Preview Enhanced De ...
- ESP32 ESP-IDF开发环境搭建,Windows下基于ESP-IDF | Cmake | VScode插件的 ESP32 开发环境搭建
之前的一篇博客 Windows上基于ESP-IDF搭建ESP32开发环境 发布后,深受好评.几个月过去了,乐鑫的esp-idf-tools安装工具发生了较大的变化,VsCode插件的功能也愈加完善 ...
- VSCode拓展插件推荐(HTML、Node、Vue、React开发均适用)
VSCode拓展插件推荐(HTML.Node.Vue.React开发均适用) 相似功能的插件,不推荐全都装上,请挑选一个使用 本列表所有插件都经过本人测试,且认为相对好用,但是不代表不存在任何问题,大 ...
- 是时候开发你自己的vscode扩展插件了
Visual Studio Code(以下简称vscode)是现在非常流行的一款编辑器,相信很多人都在用或者用过,至少也是听说过.不同于WebStorm这样的IDE大而全但稍显笨重,vscode算是比 ...
- 八个非常实用的vsCode扩展插件,千万别错过了!
vsCode是前端开发者们非常喜欢的开发程序之一,里面还提供了众多的扩展插件,帮助开发者们更好的使用它.今天小千就来给大家介绍八个非常实用的vsCode扩展插件,千万别错过了. 一.Better Co ...
- vscode编写插件详细过程
vscode编写插件详细过程 前言 之前编写了一个vscode插件用vscode写博客和发布,然后有园友要求写一篇来介绍如何开发一个vscode扩展插件,或者说介绍开发这个插件的过程.然而文章还没有写 ...
- vscode私钥设置_VSCode远程开发配置指南
凭借Windows10的大量组件和Visual Studio Code的强大插件,在Windows下远程开发Linux相关程序如今已经成为高效的选择.比起Vim,我更加喜欢VS Code,最主要的原因 ...
最新文章
- 处理字典值是把字典放内存还是用sql处理_SQL索引及其底层实现
- **IOS:xib文件解析(xib和storyboard的比较,一个轻量级一个重量级)
- Spring Security 之集群Session配置
- 未来已来 -只是尚未流行
- 干不掉的钉钉:从哪来,往哪去?
- Ubuntu 运行Asp.net MVC3
- Android延伸布局到状态栏,Android 状态栏透明
- python删除文件和linux删除文件区别_使用Python批量删除文件列表
- 骑手送外卖获奖1500多万后又遭撤销,网友:人生大起大落不过如此
- dlibdotnet 人脸相似度源代码_使用dlib中的深度残差网络(ResNet)实现实时人脸识别 - supersayajin - 博客园...
- 快慢指针算法及其应用
- paip.提升性能----jvm参数调整.txt
- 网站接口被恶意攻击怎么办
- Falsy Bouncer|FreeCodeCamp
- 股权比例的几个临界点
- cocos2dx点击按钮更改按钮图片
- 云服务器(阿里云)的简单应用
- jupyter lab R
- 脑神经科学简单介绍(小白入门)
- UA记录wegame
热门文章
- 从零开始搭建博客03----本周热议处理(redis 有序列表处理)
- 作为短信运营商,我就根据客户的需求反馈提出以下几条短信平台的实质建议
- 电子设备雷击浪涌抗扰度试验标准
- hls 网络上的m3u8视频源地址(可用的)
- APP性能测试的6项关键指标及测试获取手段
- ICPC 山东省省赛刷题 第十八届西南科技大学ACM程序设计竞赛(同步赛)牛客 BFH题解
- 一文实现yolov5实例分割(数据标注、标签转换、模型训练、模型推理)
- 计算机时代影视人类学发展,试论影视人类学de历史、现状及其理论框架.pdf
- 青蛙为什么要跳台阶,C语言趣解青蛙跳台阶问题
- 海思NB-IOT芯片,Hi2115处理器介绍