如何在扩展命令中从文件资源管理器中获取多选文件
How to get the Multi Selected files from the File Explorer in an extension command
在 package.json
中,您可以向文件资源管理器上下文菜单添加命令。
在文件资源管理器中,您可以 select 多个文件,但我的命令仅获取最后一个 selected 文件 URI 作为参数。
我可以在文件资源管理器中获取所有 selected 文件的列表吗?
您可以查看我的扩展 Find and Transform 以了解在触发资源管理器上下文菜单命令时我如何解析多个文件。 [那里有一些额外的代码,因为该命令可以通过键绑定或 explorer/editor/tab 菜单触发,因此必须以不同的方式处理它们。]
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()
[好吧,名字奇怪的函数!]。 =20=]
那里的操作位是:
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;
}
在 package.json
中,您可以向文件资源管理器上下文菜单添加命令。
在文件资源管理器中,您可以 select 多个文件,但我的命令仅获取最后一个 selected 文件 URI 作为参数。
我可以在文件资源管理器中获取所有 selected 文件的列表吗?
您可以查看我的扩展 Find and Transform 以了解在触发资源管理器上下文菜单命令时我如何解析多个文件。 [那里有一些额外的代码,因为该命令可以通过键绑定或 explorer/editor/tab 菜单触发,因此必须以不同的方式处理它们。]
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()
[好吧,名字奇怪的函数!]。 =20=]
那里的操作位是:
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;
}