当前位置: 首页 > news >正文

VSCode 插件开发实战(七):插件支持了哪些事件,以及如何利用和监听这些事件

前言

VSCode 作为现代开发者的首选编辑器之一,其核心优势在于其高度可扩展性。通过自定义插件,开发者可以根据自己的需求对编辑器进行功能扩展和优化。在这些插件开发过程中,事件处理和监听机制尤为重要,它们允许插件在特定事件发生时做出响应,从而增强用户体验并提高工作效率。本篇文章将深入探讨如何在VSCode插件中处理和监听事件,并详细列举常见的支持事件,帮助开发者更好地掌握这一关键技能。

处理和监听事件

VSCode提供了大量的事件供我们监听和处理。下面是一些常见的事件类别:

1. 文档事件

这些事件与文本文档的编辑和保存相关。

  • onDidChangeTextDocument: 监听文档内容变化。
  • onDidOpenTextDocument: 监听文档打开事件。
  • onDidCloseTextDocument: 监听文档关闭事件。
  • onDidSaveTextDocument: 监听文档保存事件。
  • onWillSaveTextDocument: 当文本文档即将保存时触发,可以用于在保存前进行一些处理。

示例代码:

import * as vscode from 'vscode';export function activate(context: vscode.ExtensionContext) {const onChangeSubscription = vscode.workspace.onDidChangeTextDocument(event => {vscode.window.showInformationMessage(`文件 ${event.document.fileName} 已更改`);});const onOpenSubscription = vscode.workspace.onDidOpenTextDocument(doc => {vscode.window.showInformationMessage(`文件 ${doc.fileName} 已打开`);});context.subscriptions.push(onChangeSubscription, onOpenSubscription);
}export function deactivate() {}

2. 编辑器事件

这些事件与编辑器实例相关。

  • onDidChangeActiveTextEditor: 监听当前活动编辑器变化。
  • onDidChangeTextEditorSelection: 监听编辑器选区变化。
  • onDidChangeTextEditorVisibleRanges: 监听编辑器可见区域变化。
  • onDidChangeTextEditorViewColumn: 监听编辑器视图列变化。
  • onDidChangeVisibleTextEditors: 当可见的文本编辑器集合变化时触发。

示例代码:

import * as vscode from 'vscode';export function activate(context: vscode.ExtensionContext) {const onActiveEditorChange = vscode.window.onDidChangeActiveTextEditor(editor => {if (editor) {vscode.window.showInformationMessage(`活动编辑器改变为 ${editor.document.fileName}`);}});const onSelectionChange = vscode.window.onDidChangeTextEditorSelection(event => {vscode.window.showInformationMessage(`选区已更改,当前文件: ${event.textEditor.document.fileName}`);});context.subscriptions.push(onActiveEditorChange, onSelectionChange);
}export function deactivate() {}

3. 窗口事件

这些事件与VSCode窗口本身的变化相关。

  • onDidChangeWindowState: 监听窗口状态变化(例如,窗口被最小化或恢复)。
  • onDidChangeActiveColorTheme: 监听活动配色主题变化。

示例代码:

import * as vscode from 'vscode';export function activate(context: vscode.ExtensionContext) {const onWindowStateChange = vscode.window.onDidChangeWindowState(event => {if (event.focused) {vscode.window.showInformationMessage('窗口已聚焦');} else {vscode.window.showInformationMessage('窗口失去焦点');}});const onThemeChange = vscode.window.onDidChangeActiveColorTheme(theme => {vscode.window.showInformationMessage(`当前主题已更改为 ${theme.kind}`);});context.subscriptions.push(onWindowStateChange, onThemeChange);
}export function deactivate() {}

4. 工作区事件

工作区事件与VSCode的工作区设置和文件系统相关。当我们需要进行某些针对工作区的操作时,这些事件非常有用。

  • onDidChangeWorkspaceFolders: 监听工作区文件夹变化(例如,添加或移除文件夹)。
  • onDidChangeConfiguration: 监听配置变化。
  • onDidChangeFileSystem: 监听文件系统变化。

示例代码:

import * as vscode from 'vscode';export function activate(context: vscode.ExtensionContext) {const onWorkspaceFolderChange = vscode.workspace.onDidChangeWorkspaceFolders(event => {event.added.forEach(folder => {vscode.window.showInformationMessage(`新增工作区文件夹: ${folder.uri.fsPath}`);});event.removed.forEach(folder => {vscode.window.showInformationMessage(`移除工作区文件夹: ${folder.uri.fsPath}`);});});const onConfigurationChange = vscode.workspace.onDidChangeConfiguration(event => {vscode.window.showInformationMessage(`配置已更改: ${event.affectsConfiguration('yourExtension.someSetting')}`);});context.subscriptions.push(onWorkspaceFolderChange, onConfigurationChange);
}export function deactivate() {}

4. 终端事件

VSCode中集成的终端也是开发过程中非常重要的工具。我们可以监听终端事件来进行一些自动化操作。

  • onDidOpenTerminal: 监听终端打开。
  • onDidCloseTerminal: 监听终端关闭。
  • onDidChangeActiveTerminal: 当活动终端发生变化时触发。
  • onDidChangeTerminalDimensions: 当终端尺寸发生变化时触发。
  • onDidWriteTerminalData: 当向终端写入数据时触发。
  • onTerminalExited: 当集成终端退出时触发。

示例代码:

import * as vscode from 'vscode';export function activate(context: vscode.ExtensionContext) {const onTerminalOpen = vscode.window.onDidOpenTerminal(terminal => {vscode.window.showInformationMessage(`终端已打开: ${terminal.name}`);});const onTerminalClose = vscode.window.onDidCloseTerminal(terminal => {vscode.window.showInformationMessage(`终端已关闭: ${terminal.name}`);});context.subscriptions.push(onTerminalOpen, onTerminalClose);
}export function deactivate() {}

5. 文件系统观察者

VSCode提供了文件系统观察者,允许我们监听特定目录或文件的变化。

  • onDidCreateFiles: 当文件被创建时触发。
  • onDidDeleteFiles: 当文件被删除时触发。
  • onDidRenameFiles: 当文件被重命名时触发。
  • onWillCreateFiles: 当文件即将被创建时触发。
  • onWillDeleteFiles: 当文件即将被删除时触发。
  • onWillRenameFiles: 当文件即将被重命名时触发。

示例代码:

import * as vscode from 'vscode';export function activate(context: vscode.ExtensionContext) {const fileWatcher = vscode.workspace.createFileSystemWatcher('**/*.js', false, false, false);fileWatcher.onDidChange(uri => {vscode.window.showInformationMessage(`文件已更改: ${uri.fsPath}`);});fileWatcher.onDidCreate(uri => {vscode.window.showInformationMessage(`新建文件: ${uri.fsPath}`);});fileWatcher.onDidDelete(uri => {vscode.window.showInformationMessage(`文件已删除: ${uri.fsPath}`);});context.subscriptions.push(fileWatcher);
}export function deactivate() {}

6. 调试(Debug)事件

  • onDidChangeActiveDebugSession: 当活动的调试会话发生变化时触发。
  • onDidChangeBreakpoints: 当断点发生变化时触发。
  • onDidReceiveDebugSessionCustomEvent: 当调试会话接收到自定义事件时触发。
  • onDidStartDebugSession: 当调试会话开始时触发。
  • onDidTerminateDebugSession: 当调试会话终止时触发。

7. 用户界面(UI)事件

  • onDidChangeActiveColorTheme: 当活动的颜色主题发生变化时触发。

8. 快捷键(Keybinding)事件

  • onDidChangeKeymap: 当键绑定发生变化时触发。

9. 输入框(InputBox)事件

  • onDidAcceptInputBox: 当用户接受输入框输入时触发。

10. 输出通道(Output Channel)事件

  • onDidChangeOutputChannel: 当输出通道内容发生变化时触发。

11. Webview 事件

  • onDidDisposeWebviewPanel: 当 Webview 面板被销毁时触发。
  • onDidChangeViewState: 当 Webview 面板的视图状态变化时触发。

12. 语言(Language)服务事件

  • onDidChangeDiagnostics: 当诊断信息发生变化时触发。
  • onDidChangeSemanticTokens: 当语义标记发生变化时触发。
  • onDidChangeTextEditorOptions: 当文本编辑器选项发生变化时触发。

13. 代码操作(Code Action)事件

  • onDidChangeCodeLenses: 当 Code Lens(代码透镜)发生变化时触发。
  • onDidChangeCodeActions: 当代码操作(如修复、重构)发生变化时触发。

14. 任务(Task)事件

  • onDidEndTask: 当任务结束时触发。
  • onDidEndTaskProcess: 当任务的进程结束时触发。
  • onDidStartTask: 当任务开始时触发。
  • onDidStartTaskProcess: 当任务的进程开始时触发。

15. 自定义树视图(Tree View)事件

  • onDidChangeTreeData: 当自定义树视图的数据发生变化时触发。

16. 可见的编辑器(Visible Editor)事件

  • onDidChangeActiveEditor: 当活动的编辑器发生变化时触发。
  • onDidChangeVisibleEditors: 当可见的编辑器集合发生变化时触发。

17. 快速选择(Quick Pick)事件

  • onDidChangeActiveQuickPickItem: 当快速选择列表中的活动项发生变化时触发。
  • onDidChangeActiveQuickPickItems: 当快速选择列表中的活动项集合发生变化时触发。
  • onDidChangeQuickPickValue: 当快速选择的输入值发生变化时触发。

18. 文档注释(Inlay Hints)事件

  • onDidChangeInlayHints: 当文档中的 Inlay Hints 发生变化时触发。

19. Webview 视图(Webview View)事件

  • onDidChangeWebviewViewVisibility: 当 Webview 视图的可见性发生变化时触发。

20. 其他常见事件

  • onDidChangeStatusBarItem: 当状态栏项发生变化时触发。

总结

通过本篇文章,我们详细探讨了VSCode插件开发中事件处理和监听的各种技巧和方法,从处理文档、编辑器、窗口、工作区和终端事件,到利用延时和节流优化性能,以及创建复杂的用户交互和自定义视图。掌握这些技术,不仅能够提高插件的性能和用户体验,还能帮助开发者实现更加复杂和功能丰富的插件。

相关文章:

VSCode 插件开发实战(七):插件支持了哪些事件,以及如何利用和监听这些事件

前言 VSCode 作为现代开发者的首选编辑器之一,其核心优势在于其高度可扩展性。通过自定义插件,开发者可以根据自己的需求对编辑器进行功能扩展和优化。在这些插件开发过程中,事件处理和监听机制尤为重要,它们允许插件在特定事件发…...

指针详解之 多层嵌套的关系

1 例子之指向3个字符串的指针数组,易混淆! 1.1过程详解: char *str[3]{ "Hello,thisisasample!", "Hi,goodmorning.", "Helloworld" }; char s[80]; strcpy(s,str[0]); //也可写成strcpy(s,*st…...

Animated Drawings:让纸上的角色动起来

前言 今天介绍的这个工具非常的有意思:它可以让我们在纸上绘画的角色动起来。先一起来看看效果: 准备 首先,我们先准备一张绘画。可以在纸上进行绘制,也可以在电子设备上进行绘制。绘制内容不限,在这里为了方便演示&am…...

技术与教育的结合:高校听课评价系统的设计与实施

3.1系统可行性分析 需要使用大部分精力开发的高校听课评价系统为了充分降低开发风险,特意在开发之前进行可行性分析这个验证系统开发是否可行的步骤。本文就会从技术角度,经济角度,还有用户使用的程序的运行角度进行综合阐述。 3.1.1 技术可行…...

web移动端项目常用解决方案

移动端总会遇到一系列特定于移动设备的问题,分享下常见的移动端常见问题的处理方案。 1px边框问题 在高清屏幕下,1px的边框显示得比较粗。 .border-1px {position: relative; } .border-1px::after {position: absolute;content: ;width: 200%;height:…...

LabVIEW软件项目设计方案如何制定

制定LabVIEW软件项目设计方案需要综合考虑需求分析、架构设计、功能模块划分和时间预算等多个方面,确保项目开发过程高效、可控且最终满足目标要求。以下是一个详细的制定流程: ​ 1. 需求分析 目标定义:明确项目的目标,例如数据采…...

数据结构(Java)——链表

1.概念及结构 链表是一种 物理存储结构上非连续 存储结构,数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。 2.分类 链表的结构非常多样,以下情况组合起来就有 8 种链表结构: (1)单向或者双向 (…...

变量与数据类型 - 整型、浮点型、字符型等

引言 在编程中,变量和数据类型是基础中的基础。理解它们如何工作以及如何正确使用它们对于编写高效且无误的代码至关重要。本文将详细介绍 C 中的几种基本数据类型:整型、浮点型、字符型等,并通过实例帮助读者更好地理解和掌握这些概念。 一…...

MacOS安装Xcode(非App Store)

文章目录 访问官网资源页面 访问官网资源页面 直接访问官网的历史版本下载资源页面地址:https://developer.apple.com/download/more/完成APP ID的登陆,直接找到需要的软件下载即可 解压后,安装将xcode.app移动到应用程序文件夹。...

运行Zr.Admin项目(后端)

1.下载Zr.Admin代码压缩包 https://codeload.github.com/izhaorui/Zr.Admin.NET/zip/refs/heads/main 2.打开项目 我这里装的是VS2022社区版 进入根目录,双击ZRAdmin.sln打开项目 3.安装.net7运行时 我当时下载的代码版本是.net7的 点击安装 点击安装&#xff0…...

Ubuntu24.04最新版本安装详细教程

Ubuntu 24.04 LTS发布说明 推荐的系统配置要求: 双核2 GHz处理器或更高 4 GB系统内存 25 GB磁盘存储空间 可访问的互联网 光驱或USB安装介质 Ubuntu 24.04官方下载网址:https://cn.ubuntu.com/download/desktop 04. Ubuntu 22.04(创建虚拟机方式一) 4…...

js版本之ES6特性简述【Proxy、Reflect、Iterator、Generator】(五)

目录 Proxy Reflect 静态方法 部分实例 Iterator 实际开发迭代器的使用实例 迭代器(Iterator)应用 Generator Proxy Proxy 是 ES6 中新增的对象 Proxy 是JavaScript中的内置对象,它提供了一种机制,可以拦截并自定义各种…...

CSS实现一个自定义的滚动条

要使用CSS创建一个自定义的滚动条&#xff0c;你可以使用伪元素和CSS的伪类来控制滚动条的外观和行为。以下是一个简单的例子&#xff0c;展示如何为任何HTML元素添加一个自定义的滚动条样式&#xff1a; <!DOCTYPE html> <html lang"en"> <head> …...

CKA认证 | Day8 K8s安全

第八章 Kubernetes安全 1、Kubernetes RBAC授权 Kubernetes 基于角色的访问控制&#xff08;Role-Based Access Control, RBAC&#xff09; 是一种强大的权限管理机制&#xff0c;用于控制用户、用户组、服务账户对 Kubernetes 集群资源的访问。通过 RBAC&#xff0c;可以细…...

深度分析java 使用 proguard 如何解析混淆后的堆栈

经过proguard混淆过后&#xff0c;发生异常时堆栈也进行了混淆&#xff0c;那么如果获取的原始的堆栈呢&#xff1f;我们下面来看下 使用proguard 根据mapping文件直接解析 import proguard.obfuscate.MappingReader; import proguard.retrace.FrameInfo; import proguard.re…...

bash 中 ${-#*i} 是什么意思?

-------------------------------------------------- author: hjjdebug date: 2024年 12月 25日 星期三 17:43:45 CST description: bash 中 ${-#*i} 是什么意思? -------------------------------------------------- 在centos 的 /etc/profile 中有这样的语句 for i in /…...

什么是Top-p采样与Top-k采样?大模型推理时如何同时设置?解析Transformers库源代码

什么是Top-p采样与Top-k采样&#xff1f;大模型推理时如何同时设置&#xff1f; 在自然语言生成&#xff08;NLG&#xff09;和大规模语言模型推理中&#xff0c;Top-k采样 和 Top-p采样 是两种常用的解码策略&#xff0c;用于控制生成文本的多样性和质量。它们在生成过程中对…...

java队列--数据结构

文章目录 前言本文源代码网址&#xff1a;https://gitee.com/zfranklin/java/tree/master/dataStructure/src/com/njupt/queue队列的性质数组队列成员变量方法 链表栈成员变量方法 总结 前言 顺序表和链表两种存储方式实现数据结构–队列。 本文源代码网址&#xff1a;https:/…...

【WebSocket】tomcat内部处理websocket的过程

websocket请求格式 浏览器请求 GET /webfin/websocket/ HTTP/1.1。 Host: localhost。 Upgrade: websocket。 Connection: Upgrade。 Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg。 Origin: http://服务器地址。 Sec-WebSocket-Version: 13。 服务器响应 HTTP/1.1 101 Swi…...

【踩坑/Linux】Vmware中的Ubuntu虚拟机无法访问互联网

Vmware中的Ubuntu虚拟机无法访问互联网 首先前提是我的系统是Ubuntu 16.04系统&#xff0c;vmware workstation选择的是NAT模式&#xff0c;虚拟机内连不上网络 ping www.baidu.com ping: unknown host www.baidu.com首先检查 DNS 解析服务&#xff1a;在虚拟机中打开命令提示…...

别只盯着价格!用统计学和三角函数“解剖”波场哈希:一份给数据科学家的区块链数据分析指南

区块链哈希值的数据科学探索&#xff1a;从统计建模到三角分析 区块链技术正在重塑数据科学的边界&#xff0c;而哈希值作为其核心组件之一&#xff0c;蕴含着丰富的数学特征等待挖掘。对于具备统计学基础的研究者而言&#xff0c;这些看似随机的字符串实际上是绝佳的研究样本。…...

如何高效突破Cursor试用限制:全功能AI编程助手解锁指南

如何高效突破Cursor试用限制&#xff1a;全功能AI编程助手解锁指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tr…...

LeetCode 热题100——128.最长连续序列

题目&#xff1a;给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。示例 1&#xff1a;输入&#xff1a;nums [100,4,200,1,3,2] 输出&…...

抖音批量下载终极指南:免费无水印,一键搞定视频、音乐、合集

抖音批量下载终极指南&#xff1a;免费无水印&#xff0c;一键搞定视频、音乐、合集 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and brows…...

终极指南:如何让2012-2015年老款Mac安装最新macOS系统

终极指南&#xff1a;如何让2012-2015年老款Mac安装最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 您的2012-2015年老款Mac是否已被苹果官方抛…...

SaaS的末日重构:AI Agent浪潮下的危机与新生

目录 前言 一、 市场恐慌的源头&#xff1a;“软件-PE”的死亡循环 二、 核心重构&#xff1a;AI 将如何改造企业级 SaaS&#xff1f; 2.1 交互层的降维打击&#xff1a;从“点界面”到“说意图” 2.2 流程层的动态重组&#xff1a;从“应用中心”到“工作流中心” 2.3 定…...

告别效率黑洞:AOSP构建降本增效实战!更有最新技术报告免费领!

近年来&#xff0c;AI模型训练与大型软件构建的复杂度持续攀升&#xff0c;企业级操作系统的多分支、多产品构建正成为工程团队的“效率黑洞”。在 Android 平台&#xff0c;AOSP 构建尤为突出&#xff1a;全量构建耗时长、增量改动触发大规模重建、CI 队列冗长、资源消耗高等问…...

数字孪生+AI:某国家级技术科研机构:耦合仿真评估部件性能,长期运维监测承压状态

部件仿真&#xff5c;设备安全&#xff5c;能源装备&#xff5c;风险评估 某国家级技术科研机构长期服务于国家级重点工程与大型产业体系&#xff0c;在复杂系统运行保障、风险评估与技术支撑等方面承担着关键角色。其业务覆盖多类型基础设施与工程场景&#xff0c;具备完善的…...

别再看水刊了!智能故障诊断领域投稿,这20+个SCI期刊才是你的目标(附避坑指南)

智能故障诊断领域投稿指南&#xff1a;20高价值SCI期刊与避坑策略 对于从事智能故障诊断研究的学者而言&#xff0c;选择合适的SCI期刊投稿是研究成果获得认可的关键一步。本文将系统梳理该领域的优质期刊资源&#xff0c;帮助您避开常见陷阱&#xff0c;提高投稿成功率。 1. 智…...

CSS 滚动驱动动画:让页面动起来的新维度

CSS 滚动驱动动画&#xff1a;让页面动起来的新维度代码如诗&#xff0c;滚动如歌。让我们用滚动驱动动画的魔法&#xff0c;为用户带来沉浸式的浏览体验。什么是滚动驱动动画&#xff1f; 滚动驱动动画&#xff08;Scroll-driven Animations&#xff09;是 CSS 中一项革命性的…...