AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

DIY VSCode 插件,让你的开发效率突飞猛进

  • 2021-01-29
  • 本文字数:3633 字

    阅读完需:约 12 分钟

DIY VSCode 插件,让你的开发效率突飞猛进

前言


Visual Studio Code(简称 VSCode)凭借其占用内存小、文件加载快、稳定性好、插件丰富等等特点,从众多 IDE 中脱颖而出,受到了广大开发人员的青睐。工欲善其事,必先利其器。选择适合自己的 VSCode 插件,能够让你的开发效率突飞猛进。VSCode 插件市场 上面插件百花齐放,但实际开发过程中问题复杂且多变,有时候并不能找到完全满足你实际开发需求的插件,那就自己动手 DIY 一个吧。VSCode 提供以下扩展能力:代码自动补全、自定义命令/菜单/快捷键、悬浮提示、自定义跳转、主题定制、自定义 WebView 等等。你可以根据自己的需要随意组合使用。


快速上手


接下来,将以一个简单的代码片段自动补全插件为例,让大家 10 分钟快速上手。代码片段自动补全也是大家编写代码时使用频率最高、最能帮助提高编码速度的功能。Demo 源码(https://github.com/Angela-Chen/vscode-test-extension



开发环境准备


  • Visual Studio Code

  • Nodejs,建议使用 LTS 版本

  • Npm

  • 官方推荐使用的脚手架工具 Yeoman 和 Generator-code

    npm install -g yo generator-code

  • 插件打包和发布工具 vsce

    npm install -g vsce


脚手架使用


  1. 执行以下命令:


yo code
复制代码


  1. 选择 New Extension 类型,然后依次填写插件名称、描述、包管理工具等基础信息。



PS:脚手架工具支持创建插件(New Extension)、主题(New Color Theme)、新语言支持(New Language Support)、代码片段(New Code Snippets)、键盘映射(New Keymap)、插件包(New Extension Pack)。以上不同类型的脚手架模板只是侧重的预设功能不同,其本质还是 VSCode 插件。


Snippets 代码片段自动补全


  1. 添加 Snippets 配置项


// package.json..."contributes": {	"snippets": [     	{            "language": "javascript",            "path": "./snippets/javascript.json"	  	},		{            "language": "typescript",            "path": "./snippets/javascript.json"		},        ...		]	},...
复制代码


在 package.json 的 contributes 下添加自定义的 Snippets。language 表示在某种特定语言下,对应的代码片段才会被加载生效。path 表示代码片段文件的存放路径。上面配置即表示 javascript 或 typescript 语言环境下,将加载 ./snippets/javascript.json 文件中的代码片段。


  1. 编写 Snippets 代码片段


// ./snippets/javascript.json{  "forEach": {    "prefix": "fe",    "body": [      "${1:array}.forEach(function(item) {",      "\t${2:// body}",      "});"    ],    "description": "Code snippet for 'forEach'"  },  "setTimeout": {    "prefix": "st",    "body": [      "setTimeout(function() {",      "\t${0:// body}",      "}, ${1:1000});"    ],    "description": "Code snippet for 'setTimeout'"  }  ...}
复制代码


上述例子中:


  • forEachsetTimeout 是代码片段的名称。

  • prefix 中定义一个或多个(设置数组时可以指定多个)触发词(trigger words),当用户输入内容是触发词时编辑器会弹出自动补全提示。

  • body 中定义的就是填充的代码段内容。body 中可以使用占位符(placeholders),如上面的 ${1:array}、 {2:// body},使用占位符方便在引用代码段的时候可以通过 tab 键快速切换跳转到对应位置编辑。冒号前面的序号表示切换的顺序,冒号后面的内容则是占位显示的默认文本。

  • description 顾名思义就是代码段的描述说明,编辑器弹出补全提示的时候会展示该描述,如果没有设置 description 字段,那么会直接展示代码段名称。


至此,插件的编码工作已经完成,是不是很简单~ 接下去,我们运行插件看下效果。


运行调试


选择 VSCode 的调试菜单(command+shift+D),点击运行按钮,弹出一个名为扩展开发主机的窗口,这个窗口就是包含这个插件的临时调试窗口。




打包和发布

打包

打包命令:vsce package,打包完成后会生成 .vsix 后缀的安装包。如果插件仅为个人或者团队内部共享,那么手动安装即可使用,无需发布到 VSCode 插件市场。

发布

发布命令:vsce publish。发布需要发布者账号,前往 Azure DevOps 注册,注册后需申请 Personal Access Tokens ,详细申请细节见 说明文档。


插件详解

目录结构


.├── .vscode	├── launch.json  # 插件加载和调试的配置├── CHANGELOG.md  # 变更记录├── extension.js  # 插件执行入口文件├── jsconfig.json  # JavaScript 类型检查配置├── node_modules├── package-lock.json├── package.json  # 声明当前插件相关信息├── README.md  # 插件使用说明└── vsc-extension-quickstart.md
复制代码

核心文件


1. package.json:插件的声明文件,包含 2 个重要配置项 activationEvents、contributes。


  • activationEvents 用于定义插件何时被加载/激活。例子中用到的是 onCommand,在 Hello World 命令被调用时,插件才会被激活。目前支持 9 种激活事件:

  • onLanguage:${language} 打开特定语言文件时

  • onCommand:${command} 调用某个 VSCode 命令时

  • onDebug Debug 时

  • workspaceContains:${toplevelfilename} 当打开包含某个命名规则的文件夹时

  • onFileSystem:${scheme} 以某个协议(ftp/sftp/ssh 等)打开文件或文件夹时

  • onView:${viewId} 指定 id 的视图展开时

  • onUri 插件的系统级 URI 打开时

  • onWebviewPanel webview 触发时

  • * VSCode 启动时。不建议使用,性能上会受到一定影响。


PS:出于性能考虑,插件都是懒加载的,只有特定场景下才会加载/激活,才会消耗内存等资源。


  • contributes 用于定义扩展项的具体配置。常用扩展项有代码片段(snippets)、命令(commands)、菜单(menus)、快捷键(keybindings)、主题(themes)。通常完成命令的开发后,会将其与菜单/快捷键进行关联,以便调用。


// package.json{  // 插件名称  "name": "vscode-test-extension",  // 显示名称  "displayName": "vscode-test-extension",  // 描述信息  "description": "An awesome vscode extension",  // 版本号 semver格式  "version": "0.0.1",  // 在插件市场展示的图标  "icon": "icon.png",  // 发布者名字  "publisher": "chenmenglan",  // 插件最低支持的vscode版本号  "engines": {    "vscode": "^1.12.0"  },  // 所属分类,可选 Languages/Snippets/Linters/Themes/Other 等等  "categories": ["Snippets", "Other"],  // 加载/激活方式  "activationEvents": ["onCommand:extension.helloWorld"],  // 入口文件路径  "main": "./extension.js",  // 注册扩展项配置  "contributes": {		"commands": [			{				"command": "extension.helloWorld",				"title": "Hello World"			}		],      	"snippets": [     		{                "language": "javascript",                "path": "./snippets/javascript.json"	  		},        ...		]	}}
复制代码


2. extension.js:插件的执行入口文件,通常包括激活(activate)和禁用(deactivate)2 个方法。命令必须先使用 vscode.commands.registerCommand 进行注册,然后将返回的实例添加至 context.subscriptions 中。当命令被激活时,会执行相应的回调方法。



const vscode = require('vscode');
/** * @param {vscode.ExtensionContext} context */function activate(context) {
console.log('Congratulations, your extension "vscode-test-extension" is now active!');
let disposable = vscode.commands.registerCommand('extension.helloWorld', function () { // 右下角消息提示 vscode.window.showInformationMessage('Hello World!'); });
context.subscriptions.push(disposable);}exports.activate = activate;
function deactivate() {}
exports.deactivate = deactivate;
复制代码

结语


如果你重复处理同一类问题超过 3 次,那么是时候该停下来思考下如何来化繁为简了。不妨花上些时间,梳理下使用频率最高或者最佳实践的代码片段,DIY 一个自己的插件,将重心放到更核心更复杂代码逻辑上。丰富的 扩展 API 让一切都比想象中来的简单,Just do what you want~


插件推荐


Auto Close Tag,自动补全关闭标签。

Auto Rename Tag,自动重命名标签。

Bracket Pair Colorizer,括号配对着色,方便查看多层嵌套的代码。

Beautify,快速格式化代码。

ESLint,语法规则和代码风格的检查工具。

Path Autocomplete,文件路径自动补全。

Document This,快速生成注释。

Todo Highlighter,高亮标记 TODO 注释,以便更容易追踪任何未完成的业务。

GitLens,增强了 VSCode 中内置的 Git 功能,包括查看代码作者、查看历史提交记录等等。


还有其他好用的插件,欢迎补充~~



头图:Unsplash

作者:沫沫

原文:https://mp.weixin.qq.com/s/XhU2BLncy1yKGPi-yPxfqw

原文:DIY VSCode 插件,让你的开发效率突飞猛进

来源:政采云前端团队 - 微信公众号 [ID:Zoo-Team]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021-01-29 22:315181

评论

发布
暂无评论
发现更多内容

Linux之uniq命令

入门小站

Linux

模块五作业

seawolflin

架构训练营

Golang协程之了解管道的缓存能力

Regan Yue

协程 Go 语言 8月日更

Go- 字符串

HelloBug

索引 字符串 Go 语言 拼接 长度

Vue进阶(五十三):vue-cli 脚手架 webpack.prod.conf.js 配置文件详解

No Silver Bullet

Vue 8月日更

模块一课后作业

穿裤子的云

架构实战营

几种常用设计模式的简单示例

编程三昧

JavaScript 大前端 设计模式 8月日更

四种常见的 POST 提交数据方式

一个大红包

8月日更

手撸二叉树之合并二叉树

HelloWorld杰少

8月日更 数据结构算法

JAVA 规范

gin

面试篇:虚拟机栈5连问,一听心里就乐了

阿Q说代码

面试 JVM 8月日更 虚拟机栈

Android开发:新建后缀为txt的文件并且使用的步骤

三掌柜

8月日更 8月

【布道API】权限错误码选择:401、403 或 404

devpoint

HTTP Authorization REST API 8月日更

java操作sql server数据库

Python研究者

8月日更

架构训练营第一模块作业(1)微信业务构架图学习

Laintime

架构实战营

Android EditText输入框实现下拉且保存最近5个历史记录

Andy阿辉

android Android 小菜鸟 编程思想 8月日更

ShardingSphere源码解析 初步准备

Java 源码 ShardingSphere

@ConditionOnClass的使用

Rubble

8月日更

Nginx-基本概念和使用

Rubble

8月日更

模块一作业2(毕设构架设计)

Laintime

如此爱国,必然自毁长城

箭上有毒

8月日更

使用Redisson优雅关闭订单

码农参上

redission 8月日更

IDEA2020.1构建Spring5.2.x源码

4ye

Java spring 源码 后端 8月日更

Android.mk

Changing Lin

8月日更

Java技术开发专题系列之【Guava Collections】实战使用相关Guava不一般的集合框架

码界西柚

Java Guava 8月日更 Guava Collections

vue入门:vuex概括与使用

小鲍侃java

8月日更

为了完成小姐姐安排的打分系统,又熬了一个小时的夜补充视图与模板

梦想橡皮擦

8月日更

CSS的设计模式(二)BEM与SMACSS

Augus

CSS 8月日更

【LeetCode】压缩字符串Java题解

Albert

算法 LeetCode 8月日更

在线BMI身体质量指数计算器

入门小站

工具

kubernetes/k8s CNI 分析 - 容器网络接口分析

良凯尔

Kubernetes 源码分析 Kubernetes Plugin #Kubernetes# cni

DIY VSCode 插件,让你的开发效率突飞猛进_语言 & 开发_政采云前端团队_InfoQ精选文章