【问题标题】:Listing files in folder in vscode extension在 vscode 扩展中列出文件夹中的文件
【发布时间】:2019-06-29 16:56:32
【问题描述】:

我正在创建一个 vscode 扩展,它可以对文件路径进行一些自定义自动完成。

我想获取用户输入的内容,如果该值解析为工作区中的文件夹,我想列出该文件夹中的所有文件以便自动完成。

例如,给定:

  • 工作区位于:/home/me/my-vs-project
  • 带有文件:
    • /home/me/my-vs-project/assets/dog.png
    • /home/me/my-vs-project/assets/cat.jpeg

如果我在 vscode 中输入“assets”或“./assets”,扩展程序应该能够为我提供一个自动完成列表:

  • './assets/dog.png'
  • './assets/cat.png'

这是一个不起作用的代码的 sn-p(返回 0 个结果)..

let inputAsWorkspaceRelativeFolder = getInput(document, position); // for example, would return: '/home/me/my-vs-project/assets' for input of './assets'

let glob = inputAsWorkspaceRelativeFolder + '/*';

vscode.workspace.findFiles(glob, null, 100).then((uris: vscode.Uri[] ) => {         
   uris.forEach((uri: vscode.Uri) => {              
         console.log(uri);
   });
}); 

由于某种原因,上面的代码返回 0 uris。关于如何格式化 glob 以实现这一点的想法?和/或是否有更好的方法?

【问题讨论】:

标签: visual-studio-code vscode-extensions


【解决方案1】:

我可以使用vscode.RelativePattern 来做到这一点——我确信我可以使用通用 GlobPatterns 来做到这一点,但我仍然不清楚findFiles(..) 在匹配文件时认为“根”是什么; RelativePattern 明确地相对于工作区根。

let workspaceFolder: vscode.WorkspaceFolder | undefined = vscode.workspace.getWorkspaceFolder(document.uri);

        if (!workspaceFolder || document.isUntitled) {
            return undefined;
        }

        // Workspace folder: /home/me/my-project
        let workspaceFolderPath: string = workspaceFolder.uri.path;

        let relativeSearchFolderPrefix = path.normalize(path.dirname(document.uri.path) + '/' + searchText);
        relativeSearchFolderPrefix = path.relative(workspaceFolderPath, relativeSearchFolderPrefix);

            let relativePattern: vscode.RelativePattern = new vscode.RelativePattern(
                workspaceFolderPath,
                relativeSearchFolderPrefix + '/**/*.{png,jpeg,jpg,gif}');

return vscode.workspace.findFiles(globPattern, null, 50).then((uris: vscode.Uri[] ) => {            
            let relativePaths: string[] = [];

            uris.forEach((uri: vscode.Uri) => {             
                relativePaths.push(path.relative(current, uri.path));
            });

            // trivial custom function that turns an array of strings into CompletionItems
            return getCompletionItems(relativePaths, vscode.CompletionItemKind.File);
        }); 

【讨论】:

  • 我认为你是 VS Code 方面的专家
  • @empire29 你的 js 扩展有 github repo 吗?我正在编写一个扩展,我正在努力在 js 中做到这一点。
【解决方案2】:

??? 我认为你冤枉了全球。 我发现这个有趣的wiki 关于 Glob 模式组合。

        let inputAsWorkspaceRelativeFolder = 'asset'; // for example, would return: '/home/me/my-vs-project/assets' for input of './assets'

        //https://github.com/ev3dev/vscode-ev3dev-browser/wiki/Glob-Patterns
        let glob = '**/'+inputAsWorkspaceRelativeFolder+'/*.*';//or +'/{*.png,*.jpeg}';

或者你可以使用node内置的fs


import * as fs from 'fs';
        fs.readdir(inputAsWorkspaceRelativeFolder, (err, files: string[]) => {
            files.forEach((file: path) => {
                const uri = vscode.Uri.file(file);
                console.log(uri);
            });
        });

更简单,如果您想获取资产文件夹中的所有文件并且不想过滤扩展名。

【讨论】:

  • 嗨!在您的 vs Glob 示例中,这不会在工作区中的任何名为“asset”的文件夹中找到所有文件吗?我想要一个只能找到文件夹直接子级文件的 glob。
  • 是的,我认为您只是错过了扩展 glob 部分。即:在`let glob = inputAsWorkspaceRelativeFolder + '/*';`结尾'/*'应该是'/*.*'或者更好的'/*.png,jpeg,jpg,gif}'
  • 查看已弃用的vscode.workspace.rootPath :当只打开一个文件夹时,该文件夹被视为工作区根目录,但是当您加载更多文件夹/工作区时,您只能使用相对模式进行搜索,因为您没有可用的根路径。
猜你喜欢
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 2017-12-15
  • 2013-04-27
  • 2021-02-07
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
相关资源
最近更新 更多