[VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建
文章目录
- VS Code扩展机制
- 项目搭建
- 创建UI元素
- 活动栏按钮
- 主边栏视图
- 主边栏工具栏按钮
- 侧边栏右键菜单
- 编辑器右键菜单
- 项目地址
- [VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建
- [VS Code扩展]写一个代码片段管理插件(二):功能实现
写代码的时候,经常要输入重复的内容,虽然VS Code提供了代码片段功能,但是创建自定义代码片段时,需要写JSON格式的配置,这些JSON文件在用户文件夹下,没有统一的界面管理,而且对于我来说,制表符补全这样的高级功能并不是必需的。
变量映射可以通过内置的映射规则在插入片段时自动生成这些内容。VS Code自带的功能比较单一,我需要一个自定义的变量映射功能,可以自定义Key-Value做为可灵活配置的变量映射。
VS Code提供了一组API,用于自定义或增强软件功能,称之为VS Code插件(或扩展)。
我基于上述的考虑,写一个带有变量映射功能代码片段管理VS Code扩展:SnippetCraft。

VS Code扩展机制
首先需要大致了解VS Code的扩展机制,VS Code可以看成一个框架,可以想象是你车上的仪表台,比如时速表仪表台,中控大屏,灯光、空调控制等独立面板所在的占位。

VS Code这些框架的部分,官方称之为“容器”,整个VS Code由6个容器组成,分别是:活动栏,主边栏,编辑器,辅边栏,面板,状态栏。

每个容器中,包含扩展提供的按钮,或者视图的区域。类似仪表台控制上的控制面板,比如灯光面板上有灯的开关,有些是预留的槽位。通过增加改装件使用这些预留槽位。

这些区域,官方称之为“项目”。常用的项目有侧边栏,编辑器,状态栏,面板上的工具栏区域。扩展可以将项目添加到各种容器中。

此外,VS Code扩展还提供常用的功能,比如数据持久化,文件选择器,输入框,通知弹窗,网页视图等。
VS Code扩展是一个基础功能,通过扩展可以满足软件的所有功能增强,包括内置的核心功能,如文件管理,搜索,Git,调试器,这些都是通过扩展实现的。
VS Code为了体验一致性,禁用扩展中UI元素自定义样式。
项目搭建
请确保已安装 Node.js。使用 Yeoman 和 VS Code 扩展生成器来快速创建扩展项目。首先安装 Yeoman 和生成器:
npm install -g yo generator-code
yo code
项目会自动创建一个HelloWorld扩展。
如果手动创建项目,可以参考下面的目录结构
my-VS Code-extension/
├── .VS Code/
│ └── extensions.json
├── src/
│ └── extension.ts
├── .gitignore
├── package.json
├── tsconfig.json
├── README.md
准备图标,扩展需要一个产品展示图标。图标为128x128像素的PNG格式文件
准备活动栏按钮图标,图标为24x24像素,居中于50x40像素的块内,填充颜色为’rgb(215, 218, 224)‘或’#d7dae0’。建议使用SVG格式的图标。
VS Code扩展在package.json中声明“贡献点”,“贡献点”用于描述该扩展可以为VS Code增强哪些功能,请参考官方说明
在package.json文件的contributes节点中,我们添加扩展用到的所有命令:
| Command | 操作 |
|---|---|
| extension.snippetCraft.searchSnipps | 代码片段搜索 |
| extension.snippetCraft.insertSnipps | 插入代码片段 |
| extension.snippetCraft.deleteAllSnippets | 删除全部代码片段 |
| extension.snippetCraft.createSnipp | 创建代码片段 |
| extension.snippetCraft.refreshEntry | 刷新代码片段列表 |
| extension.snippetCraft.addEntry | 添加代码片段 |
| extension.snippetCraft.editEntry | 编辑代码片段 |
| extension.snippetCraft.editTitle | 编辑代码片段标题 |
| extension.snippetCraft.deleteEntry | 删除代码片段 |
| extension.snippetCraft.insertEntry | 插入代码片段 |
| extension.snippetCraft.addKv | 添加映射 |
| extension.snippetCraft.refreshKv | 刷新映射列表 |
| extension.snippetCraft.deleteKv | 删除映射 |
| extension.snippetCraft.editKv | 编辑映射 |
创建UI元素
活动栏按钮
点击此按钮将打开VS Code扩展的主边栏视图。图标和名称一般为产品的Logo和名称
在package.json文件的contributes节点中,添加如下内容:
"viewsContainers": {"activitybar": [{"id": "snippsView","title": "Snippet Craft","icon": "./logo.svg"}]}
完成活动栏按钮的添加

主边栏视图
主边栏中用于直观地列出代码片段的列表和映射表
在package.json文件的contributes节点中,添加如下内容:
"views": {"snippsView": [{"id": "view.snippetCraft.snippsView","name": "Snippets列表"},{"id": "view.snippetCraft.dictionaryView","name": "映射表"}]
},
完成主边栏视图的添加

主边栏工具栏按钮
在package.json文件的contributes节点中,添加如下内容:
"view/title": [{"command": "extension.snippetCraft.addEntry","group": "navigation","when": "view == view.snippetCraft.snippsView"},{"command": "extension.snippetCraft.refreshEntry","group": "navigation","when": "view == view.snippetCraft.snippsView"},{"command": "extension.snippetCraft.searchSnipps","group": "navigation","when": "view == view.snippetCraft.snippsView"},{"command": "extension.snippetCraft.addKv","when": "view == view.snippetCraft.dictionaryView","group": "navigation"},{"command": "extension.snippetCraft.refreshKv","when": "view == view.snippetCraft.dictionaryView","group": "navigation"}]
},
完成主边栏工具栏按钮的添加


侧边栏右键菜单
在package.json文件的contributes节点中,添加如下内容:
"view/item/context": [{"command": "extension.snippetCraft.editTitle","group": "snippet","when": "view == view.snippetCraft.snippsView"},{"command": "extension.snippetCraft.deleteEntry","group": "snippet","when": "view == view.snippetCraft.snippsView"},{"command": "extension.snippetCraft.insertEntry","group": "snippet","when": "view == view.snippetCraft.snippsView"},{"command": "extension.snippetCraft.editEntry","group": "snippet","when": "view == view.snippetCraft.snippsView"},{"command": "extension.snippetCraft.editKv","when": "view == view.snippetCraft.dictionaryView","group": "kveditor"},{"command": "extension.snippetCraft.deleteKv","when": "view == view.snippetCraft.dictionaryView","group": "kveditor"}],
完成侧边栏右键菜单的添加

编辑器右键菜单
在编辑器区域右键弹出的上下文菜单中选择“插入Snippet”,可以选择一个已有的片段插入当前光标所在位置
当编辑器中有文本被选中时,上下文菜单的“创建Snippet”会显示,点击时选中的文本将作为代码片段被存储。
"menus": {"editor/context": [{"command": "extension.snippetCraft.createSnipp","when": "editorHasSelection","group": "snippet"},{"command": "extension.snippetCraft.insertSnipps","group": "snippet"}],
完成编辑器右键菜单的添加

项目地址
Github:snippet-craft
相关文章:
[VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建
文章目录 VS Code扩展机制项目搭建创建UI元素活动栏按钮主边栏视图主边栏工具栏按钮侧边栏右键菜单编辑器右键菜单 项目地址 [VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建[VS Code扩展]写一个代码片段管理插件(二&…...
vxe grid slots 用法
官方例子:Vxe Table v3.8 {field: num1,title: Num1,showHeaderOverflow: true,filters: [{ data: }],editRender: { autofocus: .my-input },slots: {// 使用插槽模板渲染default: num1_default,header: num1_header,footer: num1_footer,filter: num1_filter,edi…...
【网络】基于UDP协议的聊天室(第二篇)
目录 UDP服务器 UDP客户端 在C中,使用UDP协议进行网络通信通常涉及到socket编程。下面我将给出基于UDP的简单的客户端和服务器示例代码。这些示例将使用C标准库以及POSIX套接字接口(主要适用于Linux和类Unix系统)。如果你在使用Windows&…...
【SpringBoot3】场景整合(实战)
0 环境准备 0.0 云服务器 阿里云、腾讯云、华为云 服务器开通; 按量付费,省钱省心 安装以下组件:docker、redis、kafka、prometheus、grafana 下载windterm: https://github.com/kingToolbox/WindTerm/releases/download/2.5…...
【全网最全最详细】MYSQL 面试题大全(上)
目录 一、关系型数据库和非关系型数据库主要有哪些区别? 二、MYSQL的数据存储一定是基于硬盘的吗? 三、InnoDB和MyISAM有什么区别? 四、MyISAM的索引结构是怎么样的?存在的问题是什么? 五、char和varchar的区别? 六、MYSQL 5.x和8.0有什么区别? 七、为什么大厂不…...
【C语言】程序环境,预处理,编译,汇编,链接详细介绍,其中预处理阶段重点讲解
目录 程序环境 翻译环境 1. 翻译环境的两个过程 2. 编译过程的三个阶段 执行环境 预处理(预编译) 1. 预定义符号 2. #define 2.1 用 #define 定义标识符(符号) 2.2 用 #define 定义宏 2.3 #define 的替换规则 2.4 # 和 ## 的用法 2.5 宏和函数 2.6 #undef …...
人生低谷来撸C#--021 多线程
1、概念 线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。 线程是轻量级进程。一个使用线程的常见实例是现代操作系统中…...
【优秀python django系统案例】基于python的医院挂号管理系统,角色包括医生、患者、管理员三种
随着信息技术的迅猛发展,传统的医院挂号管理方式面临着效率低下、排队时间长、信息不对称等诸多问题。这些问题不仅影响患者的就医体验,也加重了医院工作人员的负担。在此背景下,基于Python的医院挂号管理系统应运而生。该系统旨在通过信息化…...
硬盘数据丢失不再怕,四大恢复工具帮你轻松逆转局面!
硬盘故障、误删文件、病毒攻击等原因导致数据丢失的情况时有发生。面对这种情况,如何高效、快速地进行硬盘数据恢复呢?接下来几款好用的数据恢复软件推荐给大家。 一、福昕数据恢复:全方位恢复,让数据无遗漏 链接:ww…...
自定义封装日历组件
自定义日历 工作需要,但现有框架封装的日历无法满足需求,又找不到更好的插件,所以准备自己封装一个。 效果图和说明 一个很简易版的demo日历,本文只提供最基本的功能代码,便于阅读二开。 新建calendar.vue文件 <…...
【大模型】【面试】独家总结表格
问题解答你能解释一下Transformer架构及其在大型语言模型中的作用吗?Transformer架构是一种深度神经网络架构,于2017年由Vaswani等人在他们的论文“Attention is All You Need”中首次提出。自那以后,它已成为大型语言模型(如BERT和GPT)最常用的架构。 Transformer架构使用…...
C# 6.定时器 timer
使用控件: 开启定时器:timer1.Start(); 关闭定时器:timer1.Stop(); 定时间时间间隔:Interval timer1.Interval 1000; Interva等于1000是每一秒刷新一次 定时器默认时间间隔是100ms 代码创建定时器 ①创建 Timer t1 new Timer(); …...
有了 createSlice,还有必要使用 createReducer 吗?什么情况需要 createReducer 呢?
通常情况下,使用 createSlice 已经足够满足大多数需求,而不需要直接使用 createReducer。但是,在某些特定场景下,createReducer 仍然有其用处: 更细粒度的控制: 当你需要对 reducer 的行为进行更精细的控制…...
怎么搭建AI带货直播间生成虚拟主播?
随着电商直播带货的热潮不断升温,虚拟主播逐渐崭露头角,成为电商直播领域的新宠,相较于真人主播,虚拟主播具备无档期风险、人设稳定可控、24小时不间断直播等显著优势。 本文将深入探讨如何搭建一个AI带货直播间,并详…...
设计模式的原则
设计模式的原则通常包括以下几种核心原则: 单一职责原则 (SRP):一个类应该只有一个单一的职责,即该类应该只有一个引起它变化的原因。这样可以减少类之间的耦合,使得系统更加易于维护和扩展。 开放/封闭原则 (OCP):软…...
RocketMQ与RabbitMQ的区别:技术选型指南
在现代分布式系统和微服务架构中,消息队列(Message Queue,简称MQ)扮演着至关重要的角色。消息队列用于实现系统间的异步通信、解耦、削峰填谷等功能。目前常见的MQ实现包括ActiveMQ、RabbitMQ、RocketMQ和Kafka。本文将重点对比Ro…...
小白也能懂:SQL注入攻击基础与防护指南
SQL注入是一种针对数据库的攻击方式,攻击者通过在Web表单、URL参数或其他用户输入的地方插入恶意SQL代码,以此绕过应用程序的验证机制,直接与后台数据库交互。这种攻击可以导致攻击者无授权地查看、修改或删除数据库中的数据,甚至…...
【Hot100】LeetCode—76. 最小覆盖子串
题目 原题链接:76. 最小覆盖子串 1- 思路 利用两个哈希表解决分为 :① 初始化哈希表、②遍历 s,处理当前元素,判断当前字符是否有效、③收缩窗口、④更新最小覆盖子串 2- 实现 ⭐76. 最小覆盖子串——题解思路 class Solution …...
删除排序链表中的重复元素 II(LeetCode)
题目 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 解题 class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextclass Solution:def deleteDuplicates(self…...
【Java】解决如何将Http转为Https加密输出
目录 HTTP转HTTPS一、 获取 SSL/TLS 证书二、 安装证书2.1 Apache2.2 Nginx 三、更新网站配置四. 更新网站链接五. 检查并测试六. 自动续期(针对 Lets Encrypt) HTTP转HTTPS 将网站从 HTTP 转换为 HTTPS 能够加密数据传输,还能提高搜索引擎排…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
