繁体   English   中英

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

[英]Get focused Explorer folder or file in an extension when command triggered by a shortcut, not by context menu

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

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

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

显然,function 有很多“内置”命令(“在文件资源管理器中显示”--Shift+Alt+R),我希望我自己来命令操作。

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

相关问题中有一个提示: 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"

当两个文件夹, zip和在这种情况下选择zipMultiple时,然后选择键键键键键folder-operations.createFile 因此,您必须解析/拆分该字符串才能选择两个文件夹。 与多个文件相同。



使用一些键绑定:

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

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

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

您通过键绑定获得的keybindings.json定义的键绑定是键绑定的args属性。

在 VSC 中,键绑定的定义不同。 该命令是键绑定的 function,它得到特殊的 arguments。

在文件src/vs/workbench/contrib/files/electron-browser/fileActions.contribution.ts

const REVEAL_IN_OS_COMMAND_ID = 'revealFileInOS';

KeybindingsRegistry.registerCommandAndKeybindingRule({
  id: REVEAL_IN_OS_COMMAND_ID,
  weight: KeybindingWeight.WorkbenchContrib,
  when: EditorContextKeys.focus.toNegated(),
  primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_R,
  win: {
    primary: KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_R
  },
  handler: (accessor: ServicesAccessor, resource: URI | object) => {
    const resources = getMultiSelectedResources(resource, accessor.get(IListService), accessor.get(IEditorService), accessor.get(IExplorerService));
    revealResourcesInOS(resources, accessor.get(IElectronService), accessor.get(INotificationService), accessor.get(IWorkspaceContextService));
  }
});

在扩展中,我们无法获得具有焦点的 object。

所以扩展无法获取文件资源管理器的“TreeView”。

vscode.window也不允许我们访问一些 GUI 元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM