如何开发一 VSCode 插件

如何开发一个 VSCode 插件,本文开发一个 VSCode "Hello World" 插件,通过代码了解 VSCode 插件是如何工作的。

  1. 安装脚手架

    npx --package yo --package generator-code -- yo code

根据提示选择,插件开发语言选择 TypeScript

? What type of extension do you want to create? New Extension (TypeScript)

? What's the name of your extension? Hello

? What's the identifier of your extension? hello

? What's the description of your extension? first ext

? Initialize a git repository? No

? Which bundler to use? unbundled

? Which package manager to use? yarn

  1. 打开插件开发目录

    extension.js 插件的主文件入口

    点击运行(F5),⇧⌘P 输入 Hello,点击 Hello World,屏幕右下角会出线 Hello World from Hello!

  2. 插件中重要的三个概念

  • Activation Events:激活事件决定了何时激活你的插件。你可以在 package.json 文件中的 activationEvents 字段中指定这些事件。
  • Contribution Points:贡献点可以理解为要扩展 VSCode 那个组件,例如上面的例子就是扩展 VSCode 的命令列表,在列表中添加一项。
  • VS Code API: 插件可以调用 VSCode 的 API,例如注册命令 ID。
  1. 添加菜单
    VSCode 中很多插件都会在左侧添加一个菜单按钮,下面代码用于实现添加左侧按钮
  • 添加图标

    "contributes": {
    "viewsContainers": {
    "activitybar": [
    {
    "id": "helloWorldSidebar",
    "title": "Hello World",
    "icon": "resources/milktea.png"
    }
    ]
    },
    "views": {
    "helloWorldSidebar": [
    {
    "id": "helloWorldView",
    "name": "Hello World View"
    }
    ]
    },
    "commands": [
    {
    "command": "hello.helloWorld",
    "title": "Hello World"
    }
    ]
    },

  • 点击菜单后,打开窗口的定义

    import * as vscode from 'vscode';

    export class HelloWorldViewProvider implements vscode.TreeDataProvider<HelloWorldItem> {
    private _onDidChangeTreeData: vscode.EventEmitter<HelloWorldItem | undefined | void> = new vscode.EventEmitter<HelloWorldItem | undefined | void>();
    readonly onDidChangeTreeData: vscode.Event<HelloWorldItem | undefined | void> = this._onDidChangeTreeData.event;

    复制代码
      getTreeItem(element: HelloWorldItem): vscode.TreeItem {
          return element;
      }
    
      getChildren(element?: HelloWorldItem): Thenable<HelloWorldItem[]> {
          return Promise.resolve(this.getHelloWorldItems());
      }
    
      private getHelloWorldItems(): HelloWorldItem[] {
          return [
              new HelloWorldItem('Item 1', vscode.TreeItemCollapsibleState.None),
              new HelloWorldItem('Item 2', vscode.TreeItemCollapsibleState.None)
          ];
      }
    
      refresh(): void {
          this._onDidChangeTreeData.fire();
      }

    }

    class HelloWorldItem extends vscode.TreeItem {
    constructor(
    public readonly label: string,
    public readonly collapsibleState: vscode.TreeItemCollapsibleState
    ) {
    super(label, collapsibleState);
    this.tooltip = ${this.label};
    this.description = this.label;
    }
    }

  • 入口文件注册窗口 View

    复制代码
      const helloWorldViewProvider = new HelloWorldViewProvider();
      vscode.window.registerTreeDataProvider('helloWorldView', helloWorldViewProvider);

总结

开发 VSCode 插件时,根据需要进行对应的扩展(贡献点),随后对不同的 Command 进行业务功能开发,例如命令点击、菜单点击等等。

相关推荐
向着光芒的女孩7 小时前
【IDEA】关不了的Proxy Authentication弹框探索过程
java·ide·intellij-idea
天外飞雨道沧桑9 小时前
前端开发 Cursor MCP 提效工具配置
前端·vscode·ai编程·开发工具·cursor
悟能不能悟10 小时前
怎么在idea合并2个个branch
java·ide·intellij-idea
倦王10 小时前
vscode 中如何去选择不同的远程环境去debug
ide·vscode·编辑器
c++逐梦人12 小时前
Linux下的编辑器vim的介绍
linux·编辑器·vim
焚 城14 小时前
Visual Studio 2026来临
ide·visual studio
m0_5284892515 小时前
Pycharm修改系统缓存路径(包含config, system, plugins, logs, remote sources等)
ide·python·pycharm·c盘
Franklin15 小时前
AI Coding 基础实践03 - Trae AI在Pycharm中的使用02 - 读取不了项目的文件问题解决
ide·python·pycharm
帮帮志15 小时前
PyCharm 开发工具 不同的模式
ide·python·pycharm
贝塔实验室17 小时前
Altium Designer 6.0 初学教程-在Altium Designer 中对PCB 进行板层设置及内电层进行分割
嵌入式硬件·fpga开发·编辑器·硬件工程·信息与通信·信号处理·pcb工艺