VS Code 插件开发教程

VS Code 插件开发教程

概述

Visual Studio Code(简称 VS Code)是一款由 Microsoft 开发的开源轻量级编辑器,支持跨平台(Windows、macOS、Linux)。
其最大的优势之一是强大的插件系统,开发者可以通过编写扩展(Extension)来增强 VS Code 的功能,比如支持新的编程语言、代码提示、调试器、界面主题等。

VS Code 插件的主要原理是:

  • 插件运行在独立的进程(Extension Host)中,不会阻塞编辑器主线程。
  • 插件通过 VS Code 提供的 API 与编辑器进行交互,比如注册命令、添加菜单、修改编辑器行为等。
  • 插件开发语言主要是 TypeScriptJavaScript,并基于 Node.js 生态。

安装

VS Code 安装

  1. 打开 VS Code 官方下载页面。
  2. 选择对应操作系统(Windows、macOS 或 Linux)。
  3. 按提示进行安装,安装完成后可以通过 code 命令(需要在安装时勾选“添加到 PATH”)在命令行中启动 VS Code。

插件开发环境安装

插件开发需要以下工具:

  • yo(Yeoman 脚手架工具)
  • generator-code(VS Code 插件项目生成器)
  • vsce(VS Code Extension CLI,用于打包和发布插件)

安装步骤:

# 安装 yo 和 generator-code
npm install -g yo generator-code# 安装 vsce
npm install -g @vscode/vsce

开发

生成代码

使用 Yeoman 脚手架生成插件项目:

yo code

执行后会有交互式提示,例如:

  • 选择插件类型(TypeScript / JavaScript)
  • 插件名称
  • 描述
  • 初始化 Git 仓库等

生成完成后,项目目录大致结构如下:

my-extension/
├── .vscode/           # VS Code 调试配置
├── src/               # 插件源码
│   └── extension.ts   # 插件入口文件
├── package.json       # 插件描述文件,配置命令、激活事件、依赖等
├── tsconfig.json      # TypeScript 配置(如果是 TS 项目)
└── README.md          # 插件说明文档
  • package.json:插件的核心配置文件,用来描述插件元信息和扩展点。
  • extension.ts:插件入口文件,负责注册命令和功能。
package.json 核心配置

package.json 是插件的描述文件,控制插件如何被 VS Code 加载。主要字段:

{"name": "my-extension","displayName": "My Extension","description": "一个简单的 VS Code 插件示例","version": "0.0.1","publisher": "your-name","engines": {"vscode": "^1.80.0"},"activationEvents": ["onCommand:extension.helloWorld"],"main": "./out/extension.js","contributes": {"commands": [{"command": "extension.helloWorld","title": "Hello World"}]},"scripts": {"vscode:prepublish": "npm run compile","compile": "tsc -p ./","watch": "tsc -watch -p ./","test": "npm run compile && node ./out/test/runTest.js"},"devDependencies": {"typescript": "^5.0.0","vscode": "^1.1.37"}
}

核心字段说明:

  • name:插件的唯一 ID(发布后不可更改)。
  • displayName:VS Code Marketplace 上显示的名称。
  • version:插件版本。
  • publisher:发布者名称(需与 Marketplace 发布者一致)。
  • engines.vscode:兼容的 VS Code 版本范围。
  • activationEvents:触发插件激活的事件(如 onCommandonLanguage*)。
  • main:插件的入口文件(一般是编译后的 extension.js)。
  • contributes:插件扩展点,例如命令、菜单、快捷键、配置等。
extension.ts 核心函数

extension.ts 是插件的入口文件,负责插件的生命周期和功能实现。

import * as vscode from 'vscode';/*** 插件被激活时调用* @param context 插件上下文对象,包含订阅、全局存储等*/
export function activate(context: vscode.ExtensionContext) {console.log('插件已激活!');// 注册命令let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {vscode.window.showInformationMessage('Hello World from My Extension!');});// 将命令注册到插件上下文,确保插件卸载时清理资源context.subscriptions.push(disposable);
}/*** 插件被停用时调用* 通常用于清理资源、保存数据*/
export function deactivate() {}

核心点解释:

  • activate:插件激活时执行(如首次运行命令、打开特定文件类型)。
  • deactivate:插件停用时执行,用于清理资源。
  • vscode.commands.registerCommand:注册一个命令(命令 ID 必须和 package.json 中一致)。
  • vscode.window.showInformationMessage:在 VS Code 界面右下角弹出提示消息。
  • context.subscriptions:插件上下文,保存所有注册的资源,确保在插件停用时能正确释放。

Hello World 示例

  1. 编辑 src/extension.ts,添加一个最简单的命令:
import * as vscode from 'vscode';export function activate(context: vscode.ExtensionContext) {console.log('插件已激活!');let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {vscode.window.showInformationMessage('Hello World from My Extension!');});context.subscriptions.push(disposable);
}export function deactivate() {}
  1. package.json 中配置命令:
{"contributes": {"commands": [{"command": "extension.helloWorld","title": "Hello World"}]}
}
  1. 运行调试:
  • F5 启动调试,会打开一个新的 VS Code 窗口(Extension Development Host)。
  • 打开命令面板(Ctrl+Shift+P / Cmd+Shift+P),输入并运行 Hello World
  • 会弹出消息 “Hello World from My Extension!”。

拓展介绍

VS Code 插件 API 非常丰富,常见扩展能力包括:

  • 编辑器扩展:代码高亮、自动补全、格式化器。

  • UI 扩展:状态栏、活动栏、侧边栏视图。

  • 调试扩展:调试适配器,用于支持新的调试语言。

  • 文件系统扩展:实现虚拟文件系统。

常见配置示例(在 package.json 中添加):

1. 命令(Commands)

命令是最常见的扩展方式,用户可以在命令面板(Ctrl+Shift+P)或绑定快捷键来触发。

配置(package.json)

{"contributes": {"commands": [{"command": "extension.helloWorld","title": "Hello World"}]}
}

实现(extension.ts):

vscode.commands.registerCommand('extension.helloWorld', () => {vscode.window.showInformationMessage('Hello World!');
});
2. 菜单(Menus)

可以把命令挂载到编辑器右键菜单、资源管理器右键菜单等位置。

配置(package.json)

{"contributes": {"commands": [{"command": "extension.helloWorld","title": "hello"},"menus": {"editor/context": [{"command": "extension.helloWorld","when": "editorLangId == javascript","group": "navigation"}]}}
}

说明:

  • editor/context 表示编辑器内右键菜单。
  • when 条件限制了命令只在 JavaScript 文件中出现。
  • group 决定菜单项分组(navigation = 导航相关)。
  • 菜单本身没有名字,只能通过命令 title 来显示,菜单本省command会关联到commands的命令通过command的title显示菜单名称。

菜单位置由 menus 的 key 决定,比如:

菜单位置 key:
`editor/context` 编辑器右键菜单
`editor/title` 编辑器标题栏按钮
`editor/title/context` 编辑器标题栏右键菜单
`explorer/context` 资源管理器右键菜单
`commandPalette` 命令面板(Ctrl+Shift+P)
`view/title` 视图面板标题栏按钮
`scm/title` 版本控制标题栏按钮
3. 快捷键(Keybindings)

可以为命令绑定快捷键。

配置(package.json)

{"contributes": {"keybindings": [{"command": "extension.helloWorld","key": "ctrl+alt+h","when": "editorTextFocus"}]}
}

说明:

  • key:快捷键组合。
  • when:触发条件,这里是“编辑器有焦点时”。
4. 状态栏(Status Bar Items)

可以在底部状态栏添加一个按钮。

实现(extension.ts)

let statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100);
statusBar.text = "$(smiley) Hello";
statusBar.command = "extension.helloWorld";
statusBar.show();
context.subscriptions.push(statusBar);

说明:

  • createStatusBarItem 用于创建状态栏元素。
  • text 可以包含图标(如 $(smiley))。
  • command 绑定点击事件。
5. 侧边栏视图(Views)

可以在活动栏(左侧竖栏)添加一个自定义视图。

配置(package.json)

{"contributes": {"views": {"explorer": [{"id": "mySidebar","name": "My Sidebar"}]}}
}

实现(extension.ts):

class MyTreeDataProvider implements vscode.TreeDataProvider<vscode.TreeItem> {getTreeItem(element: vscode.TreeItem): vscode.TreeItem {return element;}getChildren(): vscode.TreeItem[] {return [new vscode.TreeItem("Item 1"),new vscode.TreeItem("Item 2")];}
}vscode.window.registerTreeDataProvider("mySidebar", new MyTreeDataProvider());

说明:

  • 资源管理器面板 添加一个新视图 “My Sidebar”。

  • TreeDataProvider 动态提供数据。


6. 编辑器装饰(Decorations)

可以给代码添加背景色、高亮、提示信息等。

实现(extension.ts)

const decorationType = vscode.window.createTextEditorDecorationType({backgroundColor: "rgba(255,0,0,0.3)"
});const editor = vscode.window.activeTextEditor;
if (editor) {const range = new vscode.Range(0, 0, 0, 5);editor.setDecorations(decorationType, [range]);
}

说明:

  • createTextEditorDecorationType 定义样式。
  • setDecorations 应用到代码范围。

7. 语言支持(Language Features)

可以扩展某种语言的代码补全、悬浮提示等。

配置(package.json)

{"contributes": {"languages": [{"id": "mylang","aliases": ["MyLang"],"extensions": [".mlg"],"configuration": "./language-configuration.json"}]}
}

实现补全(extension.ts):

vscode.languages.registerCompletionItemProvider("mylang", {provideCompletionItems(document, position) {return [new vscode.CompletionItem("helloWorld", vscode.CompletionItemKind.Keyword)];}
});

说明:

  • languages 定义新语言(这里是 .mlg 后缀)。
  • registerCompletionItemProvider 提供自动补全。

8. 配置(Configuration)

插件可以在 VS Code 设置里增加配置项。

配置(package.json)

{"contributes": {"configuration": {"title": "My Extension","properties": {"myExtension.enableFeature": {"type": "boolean","default": true,"description": "是否启用我的功能"},"myExtension.apiEndpoint": {"type": "string","default": "https://api.example.com","description": "API 接口地址"}}}}
}

读取配置(extension.ts):

const config = vscode.workspace.getConfiguration("myExtension");
const enable = config.get("enableFeature", true);
const api = config.get("apiEndpoint", "");
9. 文件系统监听(File System Watcher)

可以监听文件变化事件。

实现(extension.ts)

const watcher = vscode.workspace.createFileSystemWatcher("**/*.js");
watcher.onDidChange(uri => console.log("修改: " + uri.fsPath));
watcher.onDidCreate(uri => console.log("创建: " + uri.fsPath));
watcher.onDidDelete(uri => console.log("删除: " + uri.fsPath));context.subscriptions.push(watcher);
10. 任务(Tasks)

可以让插件在 VS Code 的“任务运行器”中提供任务。

配置(package.json)

{"contributes": {"taskDefinitions": [{"type": "myTask","required": ["taskName"],"properties": {"taskName": {"type": "string","description": "任务名称"}}}]}
}

实现(extension.ts):

vscode.tasks.registerTaskProvider("myTask", {provideTasks: () => {return [new vscode.Task({ type: "myTask", taskName: "sayHello" },vscode.TaskScope.Workspace,"sayHello","myTask",new vscode.ShellExecution("echo Hello from task!"))];},resolveTask: () => undefined
});

发布

打包插件

使用 vsce 打包插件:

# 在插件项目根目录执行
vsce package

执行成功后,会生成一个 .vsix 文件,例如:

my-extension-0.0.1.vsix

安装插件:

code --install-extension my-extension-0.0.1.vsix

或者到vscode插件中心右侧… install from vsix选择本地文件。
在这里插入图片描述

发布到 VS Code Marketplace

  1. 前往 Azure DevOps 创建 Publisher

  2. 使用 vsce login <publisher-name> 登录,并输入 Personal Access Token。

  3. 发布插件:

vsce publish

或者指定版本号:

vsce publish minor

发布成功后,你的插件就会出现在 Visual Studio Marketplace 上,供所有用户下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96721.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker技术解析

1.Docker安装 1.如果Ubuntu自带的Docker版本太低&#xff0c;我们需要卸载旧版本并安装新的 sudo apt-get remove docker docker-engine docker.io containerd runc2. 备份原有软件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak3.选择合适的镜像源 # 或者使用…

TCP套接字的使用

Java中使⽤TCP协议通信,使用ServerSocket来建立链接,使用Socket进行通信.ServerSocketServerSocket是创建TCP服务端Socket的api,主要方法:方法签名说明ServerSocket(int port)创建一个服务端流套接字Socket,并绑定指定端口Socket accpet()开始监听指定端口,有客户端链接后,返回…

linux执行systemctl enable xxxxx 报 Failed to execute operation: Bad message

linux执行systemctl enable redis.service 报 Failed to execute operation: Bad message 如果在执行 systemctl enable 命令时遇到 "Failed to execute operation: Bad message" 错误&#xff0c;可能是由于以下几个原因导致的。你可以按照以下步骤进行排查和解决&a…

终端之外:解锁Linux命令行的魔法与力量

Linux命令行的核心理念 在记忆具体的指令之前&#xff0c;先理解它的哲学&#xff1a; 一切皆文件 &#xff1a;硬件设施&#xff0c;进程&#xff0c;目录…在Linux中几乎所有资源都被抽象为文件&#xff0c;这意味着你可以通过同样的指令&#xff08;如 ench ,cat&#xff…

CSS 动画实战:实现电商中“加入购物车”的抛物线效果

引言 在电商网站中&#xff0c;“加入购物车”动画 是提升用户体验的经典交互之一。一个小小的商品图标从页面飘向购物车&#xff0c;不仅直观地反馈了操作结果&#xff0c;还能增加趣味性与沉浸感。 实现这一效果的方式有很多&#xff0c;比如 JavaScript 计算路径 动画&…

深度学习之损失函数

深度神经网络由多层网络连接而成&#xff0c;网络连接处防止线性直接相关&#xff0c;采用非线性函数进行逐层隔离&#xff0c;真正实现每层参数的独立性&#xff0c;也就是只对本层提取到的特征紧密相关。因为如果是线性函数直接相连就成了一层中间网络了&#xff0c;只不过参…

Oracle OCP认证考试题目详解082系列第32题

考察知识点:Oracle profiles(配置文件) 英语题目 32.Which are two of the account management capabilities that can be configured using Oracle profiles? A.the number of days for which an account may be logged in to one or more sessions before it is locked…

Docker 部署 MongoDB:单节点与副本集的最佳实践

Docker 部署 MongoDB&#xff1a;单节点与复制集的企业级最佳实践引言&#xff1a;容器化有状态服务的范式转变第一部分&#xff1a;基础概念与生产环境考量1.1 核心 Docker 概念深度解析1.2 Volume vs. Bind Mount&#xff1a;生产环境抉择1.3 获取与验证官方镜像官方镜像默认…

公司本地服务器上搭建部署的办公系统web项目网站,怎么让外网访问?有无公网IP下的2种通用方法教程

本地物理服务器计算机搭建部署应用包括网站等&#xff0c;然后在局域网内的访问外&#xff0c;还需要提供外地的连接访问&#xff0c;这是比较常见的跨网通信需求。如在家或在外访问公司内部办公系统网站&#xff0c;这就涉及内网IP和公网IP的转换&#xff0c;或域名的解析使用…

整体设计 之 绪 思维导图引擎 之 引 认知系统 之 引 认知系统 之 序 认知元架构 之6 拼句 之1 (豆包助手 之8)

摘要(AI生成)认知演进 中 交流句子所包含的 信息描述框架 < i , j > ( m , n )本体论基础&#xff08;数学约束&#xff09;&#xff1a; n n元&#xff08;维度&#xff09;n次&#xff08;层次&#xff09;n个&#xff08;方程&#xff09;n场&#xff08;场景&am…

微软的两个调试器debugpy和python

在生成launch.json文件时&#xff0c;新版本的python扩展解释器类型是debugpy&#xff0c;而不是就版本的type:python&#xff0c;那么两者的区别在哪&#xff1f;1. 历史演变背景&#xff08;1&#xff09;旧版&#xff08;Python扩展 < 2021.09&#xff09;使用 "typ…

【连载2】C# MVC 自定义错误页设计:404/500 处理与 SEO 优化

在开发ASP.NET MVC 应用时&#xff0c;自定义错误页是提升用户体验和 SEO 表现的重要环节。默认的错误页不仅不美观&#xff0c;还可能泄露技术细节&#xff0c;影响用户体验和搜索引擎排名。 实现自定义错误页的完整代码 配置 Web.config 自定义错误页 在 ASP.NET 中&#…

mcp解读——概述及整体架构

概念介绍 什么是模型上下文协议 &#xff08;MCP&#xff09; MCP&#xff08;模型上下文协议&#xff09;是一种用于将 AI 应用程序连接到外部系统的开源标准。 使用 MCP&#xff0c;Claude 或 ChatGPT 等人工智能应用程序可以连接到数据源&#xff08;例如本地文件、数据库&a…

AI 赋能云端运维:基于 MCP 协议深度集成 Codebuddy CLI 与腾讯云 Lighthouse 的实战全解

摘要 在云计算技术飞速演进的今天&#xff0c;服务器的管理与运维正经历着从传统手动操作、脚本自动化到智能化、对话式交互的深刻变革。本文将系统性地、全流程地展示如何将腾讯云 Lighthouse 轻量应用服务器与尖端的 AI 编程助手 Codebuddy CLI 进行深度集成。我们将从服务器…

【Proteus仿真】【51单片机】教室灯光控制器设计

文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602液晶、DS1302时钟模块、人体红外感应模块、开关LED指示灯、继电器、PCF8591 ADC模块、光敏传感器、按键模块等。 主要功能&#xff1a; 系统运…

成为一个年薪30W+的FPGA工程师是一种什么体验?

FPGA&#xff08;Field-Programmable Gate Array&#xff09;是现场可编程门阵列&#xff0c;通过硬件描述语言设计电路&#xff0c;可实现并行计算&#xff0c;广泛应用于通信、人工智能、工业控制等领域。FPGA工程师的工作包括RTL设计、仿真验证、时序分析等。尽管并非所有公…

ZooKeeper Java客户端与分布式应用实战

1. ZooKeeper Java客户端实战 ZooKeeper应用开发主要通过Java客户端API连接和操作ZooKeeper集群&#xff0c;有官方和第三方两种客户端选择。 1.1 ZooKeeper原生Java客户端 依赖引入 <dependency><groupId>org.apache.zookeeper</groupId><artifactId>…

0303 【软考高项】项目管理概述 - 组织系统(项目型组织、职能型组织、矩阵型组织)

0303 【软考高项】项目管理概述 - 组织系统&#xff08;项目型组织、职能型组织、矩阵型组织&#xff09; 目录0303 【软考高项】项目管理概述 - 组织系统&#xff08;项目型组织、职能型组织、矩阵型组织&#xff09;一、基本概念二、职能型组织二、项目型组织三、矩阵型组织3…

计算机视觉与模式识别前沿一览:2025年8月arXiv 热点研究趋势解析

本推文分析了arXiv中Computer Vision and Patteren Recognition(计算机视觉与模式识别)领域2025年8月发布的近50篇论文的研究热点&#xff0c;旨在帮助读者快速了解近期领域内的前沿技术与研究方向。arXiv是全球最具影响力的开放电子预印本平台之一&#xff0c;由美国国家科学基…

vim复制本地到linux服务器上,换行缩进过大,不对的问题

所搜的试了:setlocal shiftwidth? :setlocal tabstop? :setlocal expandtab? :setlocal softtabstop?" 设置为 4 个空格缩进 :setlocal shiftwidth4" 通常你会希望 tabstop 和 softtabstop 也保持一致 :setlocal tabstop4 :setlocal softtabstop4尝试完不起作用&…