[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: # - ...
随机推荐
- vitual box 安装centos7
vitual box下载地址: https://www.virtualbox.org/wiki/Downloads centos7下载地址: CentOS Linux 选择7-2009,x86-64 ...
- centos 7 mysql8 安装和卸载
cent os 7 安装 mysql 8--install-start官网下载MySQL的RPM源,地址:https://dev.mysql.com/downloads/repo/yum/ 下载这个项 ...
- npm ERR! code EPERM npm ERR! syscall open npm ERR! path C:\Program Files\nodejs\node_cache\_cacache\
报错信息 让人摸不着头脑的报错 解决方式 简单粗暴 直接删文件 方法1:需要删除npmrc文件. 强调:不是nodejs安装目录npm模块下的那个npmrc文件 而是在C:\Users{账户}\下的. ...
- 汽车生产车间PMC组态画面应该怎么设计
通常我们所说的汽车制造四大工艺指的是:冲压.焊装.涂装.总装.一般来说,在汽车制造工厂,这四大工艺分别对应四大车间.本文结合一些实际应用案例,向大家展示一下 TopStack 在汽车制造业各工艺车间中 ...
- 天翼云centos7.6安装redis6.2.6
以下部分的具体略: 1.wget获取源码 2.make 这里重点说下,如何使用 utils/install_server.sh脚本 使用install_service.sh添加服务 有了这个脚本,那么 ...
- PPP协议简介
转载出处:https://blog.csdn.net/csucxcc/article/details/1684416 PPP(Point-to-Point Protocol)协议是在SLIP的基础上发 ...
- 算法金 | A - Z,115 个数据科学 机器学习 江湖黑话(全面)
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 机器学习本质上和数据科学一样都是依赖概率统计,今天整整那些听起来让人头大的机器学习江湖 ...
- USB OTG有关协议
想了解USB OTG的工作原理,需要知道三个协议: ADP:Attach Detection Protocol HNP:Host Negotiation Protocol SRP:Session Re ...
- 使用Xilinx SDK生成设备树
章节描述: 介绍如何通过SDK生成设备树,以用于arm-Linux环境. 背景 开发环境: Windows:Vivado 2018.3 Linux :ubuntu 16.04 介绍: Device T ...
- socket 地址复用 SO_REUSEADDR
背景 默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口(例如888),这时候,别的套接字就无法使用这个端口( 888 ) ref : https://blog.csdn.net/tenn ...