在上一节中我们创建了一个hello world扩展,那么他的工作原理是什么呢?

  • 注册onCommand激活事件:onCommand:extension.helloWorld,以便在用户运行Hello World命令时,扩展可激活
  • 使用 contributes.commands Contribution Point使命令Hello World在命令调色板中可用,并且绑定一个命令id:extension.helloWorld
  • 使用commands.registerCommand vscode api去绑定一个已经被extension.helloWorld的命令id注册的函数绑定

这里需要理解以下概念

  • Activation Event:设置扩展激活的时机。位于 package.json 中。
  • Contribution Point:设置在 VSCode 中哪些地方添加新功能,也就是这个扩展增强了哪些功能。位于 package.json 中。
  • Register:在 extension.ts 中给要写的功能用 vscode.commands.register… 给 Activation Event 或 Contribution Point 中配置的事件绑定方法或者设置监听器。位于入口文件(默认是 extension.ts)的 activate() 函数中。
  • VS Code API:你可以在扩展代码中调用的javascript api功能集合

扩展文件结构

.
├── .vscode
│   ├── launch.json     // Config for launching and debugging the extension
│   └── tasks.json      // Config for build task that compiles TypeScript
├── .gitignore          // Ignore build output and node_modules
├── README.md           // Readable description of your extension's functionality
├── src
│   └── extension.ts    // Extension source code
├── package.json        // Extension manifest
├── tsconfig.json       // TypeScript configuration
  • launch.json 用于配置vs code调试
  • tasks.json 用于定义 vs code Tasks
  • tsconfig.json 咨询TypeScript手册

扩展入口文件

扩展入口文件(extension.ts)导出两个函数:activate和deactivate(停用)

  • activate 在你的注册Activation Event发生时执行
  • deactivate 在你的扩展变成停用之前给你机会清理

附录

主要配置和APIs

Activation Events

Activation Events 这个项目定义的是插件打开的时机,可以在以下情况时打开:

  • onLanguage: 在打开对应语言文件时
  • onCommand: 在执行对应命令时
  • onDebug: 在 debug 会话开始前
  • onDebugInitialConfigurations: 在初始化 debug 设置前
  • onDebugResolve: 在 debug 设置处理完之前
  • workspaceContains: 在打开一个文件夹后,如果文件夹内包含设置的文件名模式时
  • onFileSystem: 打开的文件或文件夹,是来自于设置的类型或协议时
  • onView: 侧边栏中设置的 id 项目展开时
  • onUri: 在基于 vscode 或 vscode-insiders 协议的 url 打开时
  • onWebviewPanel: 在打开设置的 webview 时
  • *: 在打开 vscode 的时候,如果不是必须一般不建议这么设置

官方文档:activation-events

Contribution Points

官方文档:contribution-points

这个是用来用来描述你所写的插件在哪些地方添加了功能,是什么样的功能,添加的内容会显示到界面上, 前面的 hello world 示例就是在 commands 中添加了相应的 hello world 命令, 然后这个命令就可以在命令窗口执行了

APIs

所有的API定义在vscode.d.ts

主要有以下各类API:

Unit Test

具体文档可以参考testing-extension

测试插件可以使用 vscode-test API 来做测试。需要给它的 runTests 提供 extensionDevelopmentPath, extensionTestsPath 即开发目录和测试文件目录。测试则使用习惯的单元测试框架即可

import * as path from "path";

import { runTests } from "vscode-test";

async function main() {
  try {
    // The folder containing the Extension Manifest package.json
    // Passed to `--extensionDevelopmentPath`
    const extensionDevelopmentPath = path.resolve(__dirname, "../../");

    // The path to the extension test script
    // Passed to --extensionTestsPath
    const extensionTestsPath = path.resolve(__dirname, "./suite/index");

    // Download VS Code, unzip it and run the integration test
    await runTests({ extensionDevelopmentPath, extensionTestsPath });
  } catch (err) {
    console.error("Failed to run tests");
    process.exit(1);
  }
}

main();