You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VSCode扩展中获取右键菜单点击文件的URI?

问题

我正在开发一款VSCode扩展,已实现通过右键点击文件调用指定函数,相关package.json配置如下:

"main": "./extension.js",
"contributes": {
  "commands": [{
    "command": "flutter-localization-generator.create",
    "title": "localize_it: create"
  }],
  "menus": {
    "explorer/context": [{
      "command": "flutter-localization-generator.create"
    }]
  }
}

现在需要获取用户右键点击位置的URI,请问是否可行?如何在activate函数中访问该URI?我尝试了以下代码,但打印内容均未得到需要的路径:

function activate(context) {

    console.log('Congratulations, your extension "flutter-localization-generator" is now active!');

    let disposable = vscode.commands.registerCommand('flutter-localization-generator.create', function () {


        console.log(context.globalStorageUri);
        console.log(context.extensionUri);

        console.log(context.extensionPath);
        console.log(context.rootPath);

    });

    context.subscriptions.push(disposable);
}
解决方案

可行,VSCode会自动将右键点击的文件/文件夹URI作为参数传递给命令的回调函数,你只需要修改回调函数的参数定义即可获取:

  • 修改命令回调函数
    在注册命令时,给回调函数添加uri参数,这个参数就是用户右键点击位置的资源URI:

    function activate(context) {
        console.log('Congratulations, your extension "flutter-localization-generator" is now active!');
    
        let disposable = vscode.commands.registerCommand('flutter-localization-generator.create', function (uri) {
            // 打印右键点击的URI
            console.log('右键点击的URI:', uri);
            // 若需要转成本地文件路径,可使用fsPath属性
            console.log('对应本地路径:', uri.fsPath);
        });
    
        context.subscriptions.push(disposable);
    }
    
  • 可选:优化菜单配置
    可以在package.json的菜单配置中添加when条件,确保命令只在文件/文件夹上右键时显示,避免无意义的触发:

    "menus": {
      "explorer/context": [{
        "command": "flutter-localization-generator.create",
        "when": "resourceScheme == file"
      }]
    }
    

这样就能准确获取到用户右键点击位置的URI和对应的本地文件路径了。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:30:50