Как получить несколько выбранных файлов из проводника с помощью команды расширения

#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(', ');