VS Code扩展如何无需定义双入口即可获取命令执行上下文?
VS Code扩展命令区分触发来源的方案
完全不需要定义两个独立的命令入口,通过VS Code不同触发场景传入命令的参数差异就可以直接判断触发来源,实现同一入口的差异化逻辑。
实现原理
VS Code调用注册的命令时,会根据触发方式自动传入不同的参数:
- 从命令面板执行命令时,不会传入任何参数
- 从文件资源管理器右键菜单执行命令时,第一个参数为当前右键选中资源的
vscode.Uri对象,多选状态下第二个参数为所有选中资源的vscode.Uri数组
代码示例
import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { const customCommand = vscode.commands.registerCommand( '你的扩展ID.你的命令ID', // 两个参数都是可选的,仅右键触发时存在值 (targetUri?: vscode.Uri, selectedUris?: vscode.Uri[]) => { if (!targetUri) { // 命令面板触发的逻辑 vscode.window.showInformationMessage('当前命令从命令面板触发'); // 如需操作文件,可主动唤起文件选择弹窗: // const selectRes = await vscode.window.showOpenDialog(); } else { // 资源管理器右键触发的逻辑 vscode.window.showInformationMessage(`当前命令从资源管理器触发,选中文件路径:${targetUri.fsPath}`); // 多选时可通过selectedUris拿到所有选中的资源 } } ); context.subscriptions.push(customCommand); }
拓展场景兼容
如果你的命令同时支持编辑器上下文右键触发,编辑器场景会传入vscode.TextEditor类型的第一个参数,可通过类型判断进一步区分:
if (targetUri instanceof vscode.TextEditor) { // 编辑器右键触发的逻辑 }
内容的提问来源于stack exchange,提问作者Antonio Fruci
相关产品推荐
相关产品推荐

