[VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建
@
- [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"
}
],
完成编辑器右键菜单的添加
项目地址
[VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建的更多相关文章
- WPF技巧:通过代码片段管理器编写自己常用的代码模板提示效率
在写自定义控件的时候,有一部分功能是当内部的值发生变化时,需要通知控件的使用者,而当我在写依赖项属性的时候,我可以通过popdp对应的代码模板来完成对应的代码,但是当我来写属性更改回调的时候,却发现没 ...
- VisualStudio2019 利用代码片段管理器新建快捷命令
原文:https://www.cnblogs.com/huguodong/p/12694902.html 一.前言 VisualStudio 可以通过敲出缩写字符串,然后按两次Tab按键自动展开成一段 ...
- vs2019 代码片段管理
工具/代码片段管理 上面地址是vs内部代码片段,可以参考写自定义片段 写好的模板保存为.snippet文件,放到固定文件夹中,然后使用添加,直接找到文件夹添加即可 <?xml version=& ...
- 在IDE中用Bing Code Search直接查找代码片段并且插入
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在IDE中用Bing Code Search直接查找代码片段并且插入.
- 大前端工程化之写一个简单的webpack插件
今天写一个简单的webpack插件,来学习一下webpack插件 webpack插件机制可以使开发者在webpack构建过程中加入自己的行为,来针对自己项目中的一些需求做一些定制化 首先我们得知道一个 ...
- code screenshot beautify plugin & 代码截图美化插件
code screenshot beautify plugin & 代码截图美化插件 代码截图美化 codesnap 微信分享代码截图 https://github.com/kufii/Cod ...
- C#动态编译代码,执行一个代码片段,或者从指定文件中加载某个接口的实现类
在项目进行中有时候会需要配置一些复杂的表达式,在程序运行的时候执行表达式,根据结果执行相应的操作,简单写了一个类Expression,利用.net的动态编译技术实现,代码如下: public clas ...
- 2019-01-29 VS Code创建自定义Python代码片段
续前文[日常]Beyond的歌里最多是"唏嘘"吗? - Python分词+词频最后的想法, 发现VS Code支持用户自定义代码片段: Creating your own snip ...
- 用Rider写一个由Autofac管理资源的WebAPI应用程序
一:步骤和上一篇创建控制台项目一样,不过这次选择的是.net core区域下的Asp.net web application,Type里选择Web API(Web API类似java里的SpringB ...
- YASnippet - emacs 的代码片段管理工具
添加 snippet M-x 然后输入 yas-new-snippet 回车 RET,会出现一个新的 buffer # -*- mode: snippet -*- # name: # key: # - ...
随机推荐
- LeetCode 37. Sudoku Solver II 解数独 (C++/Java)
题目: Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must sati ...
- windows 命令行调整分辨率
windows 命令行调整分辨率 下载:qres_v1.1 https://abcker.lanzouq.com/i1uzA1a5uo8j 解压出来,如:D:\Soft\QRes,不要使用中文名目录. ...
- Java实际工作里用到的几种加密方式
1.Base64加密 最简单的加密方式,甚至可以说不是加密,只是一种用64个字符表示任意二进制数据的方法.Base64编码原理是将输入字符串按字节切分,取得每个字节对应的二进制值(若不足8比特则高位补 ...
- 订单请求接口设计,避免timeout超时问题 下单解决
订单请求接口设计,避免timeout超时问题 下单解决 接上篇:外部系统对接下单幂等性校验逻辑及接口超时处理 https://www.cnblogs.com/oktokeep/p/17668039.h ...
- rabbitMq消息接收转换对象,Json解析字符串报错syntax error, expect {, actual string, pos 0, fastjson-version 1.2.62解决
Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $ syntax error, expect {, actual string ...
- Thread.sleep 延时查询或延时查询前更新es缓存数据
Thread.sleep 延时查询或延时查询前更新es缓存数据 MQ消息的顺序性,或发送MQ的发送端未严格事务处理,可能存在数据未落库的情况,而导致接收端处理MQ消息的时候,查询为空. //demo1 ...
- python globals()[]将字符串转化类,并通过反射执行方法
背景: 通过关键字设计ui自动化框架,将测试用例及其步骤存放到excel文件:其中步骤中包含了封装好的关键字方法,如打开浏览器.输入页面操作等,关键字保存的内容:具体类实例.方法 通过excel获取到 ...
- 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest (Online Mirror, ICPC Rules, Teams Preferred) M. SmartGarden 题解
cf1250 M. SmartGarden 完全不会做 orz,在 cf 上看到了有趣的做法. 通读题意后可以发现是对于每一次操作,要求选出的行集合 \(R\) 和列集合 \(C\) 要满足如下条件: ...
- V4L2视频采集操作流程和接口说明
背景: V4L2是V4L的升级版本,为linux下视频设备程序提供了一套接口规范.包括一套数据结构和底层V4L2驱动接口. <WAV文件格式分析> 一般操作流程(视频设备): 1.打开设备 ...
- Python_12 多继承与多态
一.查缺补漏 1. self和super的区别:self调用自己方法,super调用父类方法 当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找 而当使用 super ...