visual-studio-code - VSCode 文件夹不按字母顺序排序
问题描述
Visual Studio Code Explorer 窗格对我的文件夹进行了奇怪的排序。在将其报告为错误之前,我想验证这确实是一个问题。我有 vscode 1.47.2。我很确定这并不总是一个问题。这是一个例子:
我希望名为“aaa.xxx.iii”的文件夹将在名为“aaa.yyy”的文件夹之前按字母顺序排序。事实上,当我在文件资源管理器中查看列表时,它确实排序正确。
我没有使用工作区文件。我已经搜索了整个目录结构,并且没有以 .code-workspace 为后缀的文件。我知道这可能是多根工作区中的一个问题。但是,我只是使用“打开文件夹”来打开此解决方案。
我还检查了工作区设置、功能、资源管理器、排序下的设置,并将其设置为默认值(字母顺序、文件前的文件夹)。我尝试更改为修改后的排序顺序并返回没有运气。
解决方案
我希望名为“aaa.xxx.iii”的文件夹将在名为“aaa.yyy”的文件夹之前按字母顺序排序
它是按字母顺序排序的,只是 ASCII 排序的!
ASCII 值:
a = 97
b = 98
i = 105
x = 120
y = 121
. = 46
所以:
aaa = 291
aaa.xxx = 697
aaa.yyy = 700
aaa.xxx.iii = 1,012
然而,他们的逻辑似乎有一些变化。他们实际上通过文件名正则表达式拆分文件名(并且他们使用相同的逻辑来比较目录和文件名)。他们首先有效地与文件名进行比较,甚至在考虑使用以下正则表达式的扩展之前:
const FileNameMatch = /^(.*?)(\.([^.]*))?$/;
然后它只会在返回时考虑扩展0
,不大于或小于。
使用该正则表达式:在您的示例中,aaa.xxx
,aaa
是文件名,.xxx
是“扩展名”。
与aaa.yyy
; aaa
是文件名并与 比较aaa.xxx.iii
,你得到它.iii
是扩展名。因此,,aaa.yyy
或不带.yyy
扩展名的名称:aaa
<aaa.xxx
或aaa.xxx.iii
带扩展名
这是他们的逻辑:
export function compareFileNamesNumeric(one: string | null, other: string | null): number {
const [oneName, oneExtension] = extractNameAndExtension(one, true);
const [otherName, otherExtension] = extractNameAndExtension(other, true);
const collatorNumeric = intlFileNameCollatorNumeric.value.collator;
const collatorNumericCaseInsensitive = intlFileNameCollatorNumericCaseInsenstive.value.collator;
let result;
// Check for name differences, comparing numbers numerically instead of alphabetically.
result = compareAndDisambiguateByLength(collatorNumeric, oneName, otherName);
if (result !== 0) {
return result;
}
// Check for case insensitive extension differences, comparing numbers numerically instead of alphabetically.
result = compareAndDisambiguateByLength(collatorNumericCaseInsensitive, oneExtension, otherExtension);
if (result !== 0) {
return result;
}
// Disambiguate the extension case if needed.
if (oneExtension !== otherExtension) {
return collatorNumeric.compare(oneExtension, otherExtension);
}
return 0;
}
所以看起来,在大多数情况下,他们只是使用带有基本名称值逻辑的Intl.Collatora < b
,当然还有一些变化。
看起来它们在长度、含义上消除了歧义,foo1
并且foo01
被认为是平等的。第 169 行
设置
您描述的设置仅影响“它们的显示方式”,以某种方式排序是的,但主要是它们如何显示给用户,而不是我解释它们如何以编程方式排序。
// 控制资源管理器中文件和文件夹的排序顺序。
// - 默认值:文件和文件夹按名称排序,按字母顺序排列。文件夹显示在文件之前。
// - 混合:文件和文件夹按名称排序,按字母顺序。文件与文件夹交织在一起。
// - filesFirst:文件和文件夹按名称排序,按字母顺序排列。文件显示在文件夹之前。
// - 类型:文件和文件夹按其扩展名排序,按字母顺序排列。文件夹显示在文件之前。
// - modified: 文件和文件夹按最后修改日期降序排列。文件夹显示在文件之前。
"explorer.sortOrder": "默认",
因此,它更多的是文件/目录的演示设置,而不是名称本身。如果您查看explorerViewer.ts
控制流,您将看到:
switch (sortOrder) {
case 'type':
if (statA.isDirectory && !statB.isDirectory) {
return -1;
}
if (statB.isDirectory && !statA.isDirectory) {
return 1;
}
if (statA.isDirectory && statB.isDirectory) {
return compareFileNamesNumeric(statA.name, statB.name);
}
break;
现在我们可以想象回到目录是如何使用相同的函数进行排序的;回覆if (statA.isDirectory && statB.isDirectory)
推荐阅读
- php - Laravel:无效的参数号:未定义参数
- events - 基于事件的与版本化事件的集成
- amazon-web-services - 用于 SFTP 只写存储桶访问的 AWS 传输?
- c# - 使用 GroupBy() 和 Sum() 的 Linq 查询和未分组的返回值
- nomachine-nx - 使用 @nrwl/web:package 编译时获取 css 文件
- json - 如何在不附加 jq 命令的情况下始终使用 jq 很好地显示 json 输出
- php - SQL查询从数据库中的一个表中获取所有帖子,但来自特定用户的最多5个条目?
- python - Module Not Found Error with one version of of Python, but no the other
- python - KivyMD | 列表项打印其“文本”on_press
- python - 更高效的 Django (SQL) 查询