В своей основной работе я работаю инженером-программистом и занимаюсь этим уже более 20 лет. В последнее время я изучаю совершенно новую парадигму программирования, и платформа Visual Studio Code от Microsoft сыграла большую роль в этом. Мне действительно начинает нравиться дикий западный подход VS Code IDE. Это немного напоминает мне ранние дни Eclipse IDE. (Ищете информацию о VS Code? Посетите их веб-сайт code.visualstudio.com.)

В VS Code у нас есть доступ практически ко всему через четко определенный API, но не совсем, и временами это проблематично. К счастью, обычно есть решения, если долго и упорно искать.

Рабочие области с одной и несколькими папками в VS Code недавно доставили мне некоторые проблемы при попытке получить дескриптор текущей выбранной папки рабочей области. Мой вариант использования был простым. У меня есть действие, которое создает файл в папке. Если папка не указана, я хочу, чтобы мое действие поместило новый файл в папку, выбранную в данный момент.

К сожалению, иногда вещи, которые кажутся самыми простыми, таковыми не являются.

В настоящее время API VS Code предлагает несколько вариантов доступа к файловой структуре рабочей области:

  • vscode.workspace.rootPath (устарело) — возвращает строку с путем к корневой папке рабочей области с одной папкой. Предлагается вместо этого использовать workspaceFolders.
  • vscode.workspace.workspaceFolders — возвращает массив объектов WorkspaceFolder, где первый элемент массива соответствует значению rootPath.

Это очень удобно для погружения в структуру, но не хватает одной важной вещи: текущего выделения.

Если в редакторе открыт файл, я могу использовать некоторую гимнастику API, чтобы получить дескриптор текущего открытого файла с помощью этого подхода:

  • vscode.window.activeTextEditor возвращает объект vscode.TextEditor или значение undefined, если ни один файл в данный момент не открыт
  • Затем TextEditor имеет свойство vscode.TextDocument, к которому я могу получить доступ через свойство документа
  • А у TextDocument есть свойство vscode.Uri, которое, в свою очередь, имеет строковое свойство fsPath, предоставляющее соответствующий путь к файловой системе.

Итак, один из ответов — открыть редактор файлов. Я могу понять, где он находится в файловой системе. Очень полезно, если я редактирую файл. Не очень полезно, если у меня нет открытых файлов.

Эта охота за мусором завела меня в долгую кроличью нору поиска в Google. Есть масса вопросов StackOverflow о получении активной папки, а также несколько дискуссий по различным проблемам GitHub.

Похоже, решение состоит в том, чтобы использовать команду vscode.commands.executeCommand('copyFilePath'), чтобы скопировать путь к текущему выбранному файлу или папке в буфер обмена, а затем использовать clipboard.paste() для извлечения и анализировать результаты.

Я был немного удивлен таким подходом, но решил попробовать. Результатом этих усилий стала функция, которую я мог использовать по-разному:

К сожалению, из-за проблемы с фокусом в веб-просмотре, из которого я вызывал эту серию команд, все, что я получал, — это координаты веб-просмотра. Не совсем то, что я искал.

К счастью, я нашел простое решение. Если бы я изменил фокус на представление Explorer ДО того, как попытался получить фокус, я смог бы получить то, что мне было нужно. vscode.commands.executeCommand(‘workbench.view.explorer’) сделал свое дело.

Это немного изменило код:

Возможно, это не решит ваших проблем, но удивительно решило одну из моих! Надеюсь, это поможет вам в вашем путешествии по VS Code!