【发布时间】:2022-01-15 02:05:39
【问题描述】:
在package.json 中,您可以将命令添加到文件资源管理器上下文菜单。
在文件资源管理器中,您可以选择多个文件,但我的命令只获取最后选择的文件 URI 作为参数。
我可以在文件资源管理器中获取所有选定文件的列表吗?
【问题讨论】:
标签: visual-studio-code vscode-extensions
在package.json 中,您可以将命令添加到文件资源管理器上下文菜单。
在文件资源管理器中,您可以选择多个文件,但我的命令只获取最后选择的文件 URI 作为参数。
我可以在文件资源管理器中获取所有选定文件的列表吗?
【问题讨论】:
标签: visual-studio-code vscode-extensions
您可以查看我的扩展名Find and Transform,以了解在触发资源管理器上下文菜单命令时我如何解析多个文件。 [那里有一些额外的代码,因为该命令可以由键绑定或资源管理器/编辑器/选项卡菜单触发,因此必须以不同的方式处理它们。]
let contextMenuCommandFile = vscode.commands.registerCommand('find-and-transform.searchInFile', async (...commandArgs) => {
let args = {};
if (commandArgs?.length === 1 && !(commandArgs[0] instanceof vscode.Uri)) { // if from keybinding
let argsArray = Object.entries(commandArgs[0]).filter(arg => {
return searchCommands.getKeys().includes(arg[0]);
});
Object.assign(args, Object.fromEntries(argsArray));
}
args.filesToInclude = await parseCommands.parseArgs(commandArgs, "file");
args.triggerSearch = true;
searchCommands.useSearchPanel(args);
});
context.subscriptions.push(contextMenuCommandFile);
您可能缺少此 async (...commandArgs) => { 以将所有可用的传递参数放入数组中。
...commandArgs 如果来自键绑定,则长度为 1,如果从上下文菜单触发,则长度为 2无论在资源管理器中选择了多少文件,然后右键单击一个并选择命令。
commandArgs[0] 是我右键单击的单个文件(即最后一个文件)。commandsArgs[1] 本身是资源管理器中所有选定文件的数组。
然后,我将要解析的 commandArgs 数组(因为我只需要一个以逗号分隔的所选文件列表)发送到 parseCommands.parseArgs() [好吧,这个函数名字很奇怪!)。
这里的操作位:
else if (commandArgs[1][0] instanceof vscode.Uri) { // explorer/context
for (const resource of commandArgs[1]) {
const thisResource = vscode.workspace.asRelativePath(resource.fsPath);
resources += `${ thisResource }, `;
}
resources = resources.substring(0, resources.length - 2); // strip ', ' off end
return resources;
}
【讨论】:
...,我编程的Python很多,你可以简单的结果字符串:return commandArgs[1].map(r => vscode.workspace.asRelativePath(r.fsPath)).join(', ');