首页 > 解决方案 > 当命令由快捷方式而不是上下文菜单触发时,在扩展中获取焦点资源管理器文件夹或文件

问题描述

这个问题的后续:当用户右键单击资源管理器/上下文中的文件时,如何在 vscode 扩展名中获取文件名或路径?

我的命令希望通过右键单击接收到所选项目的 uri;事实上,如果我通过从上下文菜单中选择命令来调用命令,它确实如此......

但是,如果我将快捷键绑定到此命令(并正确设置“何时”上下文以仅在资源管理器具有焦点时激活)我没有收到 uri;那个参数是undefined

显然,有很多“内置”命令(“在文件资源管理器中显示”--Shift+Alt+R)按照我希望自己的命令操作的方式发挥作用。

当使用键盘快捷键调用时,将 uri 获取到我自己的命令有什么技巧?

标签: visual-studio-codevscode-extensions

解决方案


相关问题中有一个提示:Get selected file/folder in Explorer view

建议使用

vscode.commands.executeCommand('copyFilePath');

https://github.com/Microsoft/vscode/issues/3553#issuecomment-438969485

所以我对此进行了调查,它可以像这样工作:

async function activate(context) {

   let createFile = vscode.commands.registerCommand('folder-operations.createFile', async (folder) => {

    // use this if triggered by a menu item,
    let newUri = folder;  // folder will be undefined when triggered by keybinding

     if (!folder) {                       // so triggered by a keybinding
       await vscode.commands.executeCommand('copyFilePath');
       folder = await vscode.env.clipboard.readText();  // returns a string

       // see note below for parsing multiple files/folders
       newUri = await vscode.Uri.file(folder);          // make it a Uri 
     }

     createFileOpen(newUri);                 // use in some function  
  });
  context.subscriptions.push(createFile);
}

笔记 :

这在选择多个文件夹或文件时也有效。然后folder = await vscode.env.clipboard.readText();将返回类似(在 W10 上):

"C:\\Users\\Mark\\OneDrive\\Test Bed\\zip\r\nC:\\Users\\Mark\\OneDrive\\Test Bed\\zipMultiple"

当两个文件夹(zipzipMultiple这种情况下)被选中,然后为folder-operations.createFile命令触发键绑定。因此,您必须解析/拆分该字符串才能选择两个文件夹。与多个文件相同。



使用一些键绑定:

{
  "key": "shift+alt+c",
  "command": "folder-operations.createFile",
  "when": "explorerResourceIsFolder && filesExplorerFocus"
}

现在,当某个文件夹集中在资源管理器中并且您触发键绑定时,这将起作用。演示通过键绑定创建新文件:

通过键绑定获取扩展中的文件夹路径


推荐阅读