当前位置: 首页 > 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;在虚拟机中打开命令提示…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...