一. VSCode extension 可以做什么?
如果你有一个很棒的(关于代码的)点子,除非遇到不可实现的客观条件,否则一切皆可实现;
二. VSCode 插件开发流程
1. 开发环境配置
// 安装需要的包
npm install -g yo generator-code
2. 开发
// 运行命令,创建工程
yo code
//。。。实现功能(推荐使用typescript);
3. 插件发布
1.注册账号 https://aka.ms/SignupAzureDevOps;
2.创建 Personal Access Token
点击创建新的个人访问令牌,这里特别要注意Organization要选择all accessible organizations,Scopes要选择Full access,否则后面发布会失败。
3.打包发布
vsce package
vsce publish -p <Personal Access Token>
三. extension
{
// 插件的名字,应全部小写,不能有空格
"name": "vscode-plugin-demo",
// 插件的友好显示名称,用于显示在应用市场,支持中文
"displayName": "VSCode插件demo",
// 描述
"description": "VSCode插件demo集锦",
// 关键字,用于应用市场搜索
"keywords": ["vscode", "plugin", "demo"],
// 版本号
"version": "1.0.0",
// 发布者,如果要发布到应用市场的话,这个名字必须与发布者一致
"publisher": "sxei",
// 表示插件最低支持的vscode版本
"engines": {
"vscode": "^1.27.0"
},
// 插件应用市场分类,可选值: [Programming Languages, Snippets, Linters, Themes, Debuggers, Formatters, Keymaps, SCM Providers, Other, Extension Packs, Language Packs]
"categories": [
"Other"
],
// 插件图标,至少128x128像素
"icon": "images/icon.png",
// 扩展的激活事件数组,可以被哪些事件激活扩展,后文有详细介绍
"activationEvents": [
"onCommand:extension.sayHello"
],
// 插件的主入口
"main": "./src/extension",
// 贡献点,整个插件最重要最多的配置项
"contributes": {
// 插件配置项
"configuration": {
"type": "object",
// 配置项标题,会显示在vscode的设置页
"title": "vscode-plugin-demo",
"properties": {
// 这里我随便写了2个设置,配置你的昵称
"vscodePluginDemo.yourName": {
"type": "string",
"default": "guest",
"description": "你的名字"
},
// 是否在启动时显示提示
"vscodePluginDemo.showTip": {
"type": "boolean",
"default": true,
"description": "是否在每次启动时显示欢迎提示!"
}
}
},
// 命令
"commands": [
{
"command": "extension.sayHello",
"title": "Hello World"
}
],
// 快捷键绑定
"keybindings": [
{
"command": "extension.sayHello",
"key": "ctrl+f10",
"mac": "cmd+f10",
"when": "editorTextFocus"
}
],
// 菜单
"menus": {
// 编辑器右键菜单
"editor/context": [
{
// 表示只有编辑器具有焦点时才会在菜单中出现
"when": "editorFocus",
"command": "extension.sayHello",
// navigation是一个永远置顶的分组,后面的@6是人工进行组内排序
"group": "navigation@6"
},
{
"when": "editorFocus",
"command": "extension.demo.getCurrentFilePath",
"group": "navigation@5"
},
{
// 只有编辑器具有焦点,并且打开的是JS文件才会出现
"when": "editorFocus && resourceLangId == javascript",
"command": "extension.demo.testMenuShow",
"group": "z_commands"
},
{
"command": "extension.demo.openWebview",
"group": "navigation"
}
],
// 编辑器右上角图标,不配置图片就显示文字
"editor/title": [
{
"when": "editorFocus && resourceLangId == javascript",
"command": "extension.demo.testMenuShow",
"group": "navigation"
}
],
// 编辑器标题右键菜单
"editor/title/context": [
{
"when": "resourceLangId == javascript",
"command": "extension.demo.testMenuShow",
"group": "navigation"
}
],
// 资源管理器右键菜单
"explorer/context": [
{
"command": "extension.demo.getCurrentFilePath",
"group": "navigation"
},
{
"command": "extension.demo.openWebview",
"group": "navigation"
}
]
},
// 代码片段
"snippets": [
{
"language": "javascript",
"path": "./snippets/javascript.json"
},
{
"language": "html",
"path": "./snippets/html.json"
}
],
// 自定义新的activitybar图标,也就是左侧侧边栏大的图标
"viewsContainers": {
"activitybar": [
{
"id": "beautifulGirl",
"title": "美女",
"icon": "images/beautifulGirl.svg"
}
]
},
// 自定义侧边栏内view的实现
"views": {
// 和 viewsContainers 的id对应
"beautifulGirl": [
{
"id": "beautifulGirl1",
"name": "国内美女"
},
{
"id": "beautifulGirl2",
"name": "国外美女"
},
{
"id": "beautifulGirl3",
"name": "人妖"
}
]
},
// 图标主题
"iconThemes": [
{
"id": "testIconTheme",
"label": "测试图标主题",
"path": "./theme/icon-theme.json"
}
]
},
// 同 npm scripts
"scripts": {
"postinstall": "node ./node_modules/vscode/bin/install",
"test": "node ./node_modules/vscode/bin/test"
},
// 开发依赖
"devDependencies": {
"typescript": "^2.6.1",
"vscode": "^1.1.6",
"eslint": "^4.11.0",
"@types/node": "^7.0.43",
"@types/mocha": "^2.2.42"
},
// 后面这几个应该不用介绍了
"license": "SEE LICENSE IN LICENSE.txt",
"bugs": {
"url": "https://github.com/sxei/vscode-plugin-demo/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/sxei/vscode-plugin-demo"
},
// 主页
"homepage": "https://github.com/sxei/vscode-plugin-demo/blob/master/README.md"
}
setttings example:
"contributes": {
"commands": [
{
"command": "extension.EasyFlutterPlugin",
"title": "Easy Flutter Plugin"
}
],
"menus": {
"editor/context": [
{
"when": "resourceLangId == dart",
"command": "extension.EasyFlutterPlugin",
"group": "navigation"
}
]
},
"configuration": {
"type": "object",
"title": "Easy Flutter Plugin",
"properties": {
"easy-flutter-plugin.yourName": {
"type": "string",
"default": "guest",
"description": "你的名字"
},
"easy-flutter-plugin.showTip": {
"type": "boolean",
"default": true,
"description": "是否在每次启动时显示欢迎提示!"
},
"easy-flutter-plugin.input": {
"type": "string",
"default": "defaultValue",
"description": "provide a input for accepting value"
},
"easy-flutter-plugin.inputNum": {
"type": "number",
"default": "1.001",
"description": "provide a input for accepting number"
},
"easy-flutter-plugin.inputInt": {
"type": "integer",
"default": "1",
"markdownDescription": "MarkdownDescription: provide a input for accepting integer, See the [VSCode Docs (https://code.visualstudio.com/api/references/contribution-points#contributes.configuration) for more details.\n - a: item1\n - b: itemb"
},
"easy-flutter-plugin.checkbox": {
"type": "boolean",
"default": "0",
"description": "provide a checkbox"
},
"easy-flutter-plugin.dropdown": {
"type": "string",
"default": "defaultValue",
"enum": [
"optionA",
"optionB",
"optionC"
],
"description": "provide a dropdown and options",
"enumDescriptions": [
"description for option A",
"description for option B",
"description for option C"
]
},
"easy-flutter-plugin.array": {
"type": "array",
"default": [
"defaultValue"
],
"description": "array settings is only available at settings.json"
},
"easy-flutter-plugin.object": {
"type": "object",
"default": {
"key" : "defaultValue"
},
"description": "object settings is only available at settings.json"
},
"easy-flutter-plugin.null.a": {
"type": null,
"default": null,
"description": "null settings for showing group feature"
},
"easy-flutter-plugin.null.b": {
"type": null,
"default": null,
"description": "null settings for showing group feature"
}
}
}
}
其他
个人开发插件 easy-flutter-plugin 用于将 flutter plugin 功能简化;
根据 lib dart方法一键生成 objc/swift + java/kotlin + web .dart + example/lib/.main.dart + test.dart 的方法生成;
开发者只需要关注函数内部实现即可;模板化的工作让插件生成,提高开发效率;