VSCode扩展开发:如何获取当前编辑/查看的文件及工作区信息
VS Code 类 Discord Rich Presence 扩展状态信息获取实现
这类扩展获取当前编辑文件、工作区名称的逻辑完全基于VS Code官方暴露的扩展API,没有任何逆向或者hack操作,你觉得代码难读纯粹是因为混淆了外围无关逻辑,核心信息获取功能几十行代码就能写完。
当前编辑文件信息获取
你看到的Editing [file].js对应的文件名,直接通过VS Code的窗口对象就能拿到:
- 扩展启动时先读取
window.activeTextEditor属性,就能拿到当前激活的编辑器实例,从实例挂载的document对象的fileName字段里取到当前打开文件的完整本地路径,截掉路径前缀就是要展示的文件名。 - 注册
window.onDidChangeActiveTextEditor事件监听,只要用户切换标签、切换打开的编辑器,就会触发回调,拿到最新的编辑器实例更新文件名即可。
最小实现代码参考:
import { window } from 'vscode'; // 初始化时读取当前打开的文件 let activeFileName = window.activeTextEditor ? window.activeTextEditor.document.fileName.split(/[\\/]/).pop() : null; // 监听切换事件实时更新 window.onDidChangeActiveTextEditor(editor => { activeFileName = editor ? editor.document.fileName.split(/[\\/]/).pop() : null; // 拿到最新文件名后推送给你的状态同步服务即可 pushStatusToServer({ editingFile: activeFileName }); });
如果当前打开的是VS Code内置的设置页、扩展市场面板这类无本地文件的页面,document.fileName会返回特殊的内部标识,你可以自己加过滤规则,只展示真实的本地代码文件。
当前工作区名称获取
Workspace: [name]对应的工作区名称获取更简单,直接读workspace.name属性就能拿到当前打开的工作区名称。如果用户开了多根工作区模式,可以遍历workspace.workspaceFolders数组拿到所有工作区信息,一般这类扩展默认取第一个工作区名称展示即可。
如果要响应工作区切换的操作,注册workspace.onDidChangeWorkspaceFolders事件监听就行,触发时重新读取workspace.name更新状态。
参考代码:
import { workspace } from 'vscode'; // 初始化读取当前工作区 let activeWorkspaceName = workspace.name; // 监听工作区变更 workspace.onDidChangeWorkspaceFolders(() => { activeWorkspaceName = workspace.name; pushStatusToServer({ workspace: activeWorkspaceName }); });
混淆代码对应的常见非核心逻辑
你之前看到的混淆内容,基本都是在处理这些和信息获取无关的逻辑:
- 状态更新防抖:避免用户快速切换文件时短时间发送大量请求,一般会加2-3秒的防抖延迟
- 文件类型图标匹配:根据文件后缀匹配对应展示的图标,比如.js文件展示JavaScript标识、.go文件展示Go标识
- 通信逻辑:官方Discord扩展是和本地Discord客户端的本地RPC端口通信,你要同步到个人网站的话,把这部分逻辑改成给你自己的服务端发HTTP请求、或者走WebSocket长连接推状态即可
- 闲置检测:监听用户的键盘、鼠标操作,判断用户多久没操作VS Code,自动切换到闲置状态
安全提示:VS Code扩展运行在本地环境,不要直接把扩展监听的端口暴露到公网,本地拿到状态后推送到你自己的中转服务,网站端从中转服务拉取状态即可,避免泄露本地文件路径等隐私信息。
内容的提问来源于stack exchange,提问作者user17750267
相关产品推荐
相关产品推荐

