vscode 插件开发

475 阅读3分钟

vscode 插件开发

初始化项目

官方为插件开发提供了脚手架,直接使用脚手架来生成初始项目。

# 全局安装 yo 和 generator-code 两个库(推荐使用node18以上环境)
npm install -g yo generator-code

# 使用 yo 指令生成 vscode 项目模板
yo code

使用 yo code 生成初始化项目,你能发现vscode插件能做的类型。(包含了我们日常经常有使用到的一些功能,如安装vscode后的第一件事装个中文的语言包(Localization)、装个便于React/Vue开发的插件(Language Support)、换个主题(Color Theme))


     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------´   │        generator!        │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? What type of extension do you want to create? (Use arrow keys)
❯ New Extension (TypeScript)
  New Extension (JavaScript)
  New Color Theme // 制作主题
  New Language Support // 制作编程语言包
  New Code Snippets // 制作代码片段
  New Keymap // 制作定制的快捷键
  New Extension Pack // 将多个插件集合成一个包
  New Language Pack (Localization) // 制作翻译包
  New Web Extension (TypeScript) // 可以使用html、css、js生成网页,在vscode中以webview形式展现
  New Notebook Renderer (TypeScript) // 看介绍似乎是一个可以执行python的可视化笔记插件?

项目结构

贴图:

介绍下几个重点文件

├── .vscode
│   ├── launch.json     
│   └── tasks.json      
├── .gitignore        
├── README.md          
├── src
│   └── extension.ts    
├── package.json        
├── tsconfig.json       

extension.ts 可以认为是插件的入口文件,所有插件执行都会从执行 activate 这个生命周期开始,我们在 extension.ts 中注册事件

export function activate(context: vscode.ExtensionContext) {

        // 注册事件 normal-extension.helloWorld
	const disposable = vscode.commands.registerCommand('normal-extension.helloWorld', () => {
		vscode.window.showInformationMessage('Hello World from normal-extension!');
	});

	context.subscriptions.push(disposable);
}

在 package.json 中声明该事件

"contributes": {
    // 命令
    "commands": [
      {
        "command": "normal-extension.helloWorld",
        "title": "Hello World"
      }
    ],
    // 菜单
    "menus": {
      "editor/context": [
        {
          "when": "editorTextFocus",
          "command": "normal-extension.helloWorld"
        }
      ]
    }
  },

通过在 extension.ts 注册事件的回调,可以调用vscode提供的API,编写逻辑实现插件功能。在 package.json 中声明事件,将事件设置自执行,或是输入命令执行或是添加到菜单中点击执行,这就是插件制作的基本逻辑。

上边介绍可以认为是通用的插件开发选择 New Extension,接下来介绍几种其他的插件开发

color theme

在脚手架工具中选择 New Color Theme,创建项目 与默认的 New Extension 插件开发不同的是,并没有 src/extension.ts 文件,而是一个 themes 和 color-theme-color-theme.json 主题配置文件

"name": "Keywords",
"scope": [
    "keyword",
    "storage"
],
"settings": {
	"foreground": "#acfb00"
}

例如可以把想要的关键字换成黄色,背景换成黑色等等,执行后就可以得到定制的主题。

image.png

webView

涉及到web的功能场景往往都可以实现的很庞大且复杂,甚至超出vscode API支持的能力,例如官网中表明vscode内置的Markdown就是通过webView来实现的。

在 extension.ts activate 中注册事件,在 package.json 中声明事件,使用 webView

import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
 
  let disposable = vscode.commands.registerCommand('webview-extension.helloWorld', () => {
    vscode.window.showInformationMessage('Hello World from webview-extension!');

	const panel = vscode.window.createWebviewPanel(
		'catCoding',
		'Cat Coding',
		vscode.ViewColumn.One,
		{
		  retainContextWhenHidden: true, // 保证 Webview 所在页面进入后台时不被释放
		  enableScripts: true, // 运行 JS 执行
		}
	  );
	panel.webview.html = getWebviewContent();
  });

  context.subscriptions.push(disposable);
}

function getWebviewContent() {
  return `<!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Cat Coding</title>
      </head>
      <body>
	    <p>I'm a Coding Cat</p>
		<img src="https://media.giphy.com/media/JIX9t2j0ZTN9S/giphy.gif" width="300" />
      </body>
    </html>`;
}

image.png

打包

打包插件需要一个命令行工具 vsce(Visual Studio Code Extensions) 可以用来打包、发布和管理插件。

安装 vsce

npm install -g @vscode/vsce

打包

vsce package

执行后,将会在根目录下生成一个 .vsix 包,这个包就是可以直接安装的插件包

发布

可以参考官网文档中的 发布流程。首先注册 Azure DevOps,成为开发者,通过绑定绑定 Token 信息,上传到发布管理工具中。

官方文档

官方文档

官方案例

UI 准则,可以看到 vscode 所有支持扩展的地方

官方文档的社区翻译版本,有一段时间没维护了

package.json 配置字段清单

package.json contribution 属性配置清单