![](/img/trans.png)
[英]VSCode Extension API - Identify file or folder click in explorer context menu
[英]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.