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
英文地址,請注明出處:http://en.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嘗試完不起作用&…