首页 > 解决方案 > VSCode 文件夹不按字母顺序排序

问题描述

Visual Studio Code Explorer 窗格对我的文件夹进行了奇怪的排序。在将其报告为错误之前,我想验证这确实是一个问题。我有 vscode 1.47.2。我很确定这并不总是一个问题。这是一个例子:

VSCode 资源管理器截图

我希望名为“aaa.xxx.iii”的文件夹将在名为“aaa.yyy”的文件夹之前按字母顺序排序。事实上,当我在文件资源管理器中查看列表时,它确实排序正确。

我没有使用工作区文件。我已经搜索了整个目录结构,并且没有以 .code-workspace 为后缀的文件。我知道这可能是多根工作区中的一个问题。但是,我只是使用“打开文件夹”来打开此解决方案。

我还检查了工作区设置、功能、资源管理器、排序下的设置,并将其设置为默认值(字母顺序、文件前的文件夹)。我尝试更改为修改后的排序顺序并返回没有运气。

标签: visual-studio-code

解决方案


我希望名为“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.xxxaaa.xxx.iii带扩展名

这是他们的逻辑:

explorerViewer.ts

比较器.ts

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.Collat​​ora < 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)


推荐阅读