#visual-studio-code #vscode-extensions
#visual-studio-code #vscode-расширения
Вопрос:
В package.json
вы можете добавить команду в контекстное меню проводника файлов.
В проводнике файлов вы можете выбрать несколько файлов, но моя команда получает только последний выбранный URI файла в качестве аргумента.
Могу ли я получить список всех выбранных файлов в проводнике?
Ответ №1:
Вы можете посмотреть на мое расширение Find и Transform, чтобы увидеть, как я анализирую несколько файлов при запуске команды контекстного меню explorer. [Там есть некоторый дополнительный код, потому что эта команда может быть вызвана привязкой клавиш или меню проводника / редактора / вкладки, поэтому их нужно обрабатывать по-разному.]
let contextMenuCommandFile = vscode.commands.registerCommand('find-and-transform.searchInFile', async (...commandArgs) => {
let args = {};
if (commandArgs?.length === 1 amp;amp; !(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;
}
Комментарии:
1. Ах, это досадно
...
, я программирую на большом количестве Python, вы можете просто результирующую строку:return commandArgs[1].map(r => vscode.workspace.asRelativePath(r.fsPath)).join(', ');