我正在创建一个vscode扩展名,它可以对文件路径进行一些自定义自动完成。
我想获取用户键入的内容,如果该值解析为工作区中的文件夹,我想列出该文件夹中的所有文件以自动完成。
例如,给定:
如果我在vscode中输入“ assets”或“ ./assets”,则扩展名应该能够为我提供以下内容的自动填充列表:
这是无效的代码片段(返回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。关于我必须如何格式化全局以实现此目的的想法?和/或是否有更好的方法?
答案 0 :(得分:0)
??? 我想你冤wrong了这个世界。 我发现有关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}';
或者您可以使用内置的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);
});
});
更简单,如果您想获取资产文件夹中的所有文件并且不想过滤扩展名。
答案 1 :(得分:0)
我能够使用vscode.RelativePattern
来做到这一点-我敢肯定我可以使用通用的GlobPatterns来做到这一点,但是我仍然不清楚findFiles(..)
在匹配文件时将'root'视为什么; 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);
});