【问题标题】:VSCode Folders Not Sorting AlphabeticallyVSCode 文件夹不按字母顺序排序
【发布时间】:2020-07-19 14:30:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: visual-studio-code


    【解决方案1】:

    我希望名为“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.xxxaaa 是文件名,.xxx 是“扩展名”。

    aaa.yyy; aaa 是文件名,与aaa.xxx.iii 比较,你会发现.iii 是扩展名。因此,aaa.yyy,或不带 .yyy 扩展名的名称:aaa aaa.xxx 或 aaa.xxx.iii 带扩展名

    这是他们的逻辑:

    explorerViewer.ts

    comparers.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.Collator 和基本名称值a < b 逻辑,当然还有一些变化。

    它们似乎也通过长度来消除歧义,这意味着 foo1foo01 被认为是相等的。 line 169


    设置

    您描述的设置仅影响“它们的显示方式”,以某种方式排序是的,但主要影响它们向用户显示的方式,而不是按照我的解释以编程方式对它们进行排序。

    // 控制资源管理器中文件和文件夹的排序顺序。

    // - 默认值:文件和文件夹按名称排序,按字母顺序排列。文件夹显示在文件之前。

    // - 混合:文件和文件夹按名称排序,按字母顺序排列。文件与文件夹交织在一起。

    // - filesFirst:文件和文件夹按名称排序,按字母顺序排列。文件显示在文件夹之前。

    // - 类型:文件和文件夹按其扩展名按字母顺序排序。文件夹显示在文件之前。

    // - 修改:文件和文件夹按最后修改日期降序排列。文件夹显示在文件之前。

    “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)

    【讨论】:

      【解决方案2】:

      看来这是一个悬而未决的问题。我在 GitHub 上更改了搜索词,并找到了原始讨论。这条评论似乎没有解决方案。

      https://github.com/microsoft/vscode/issues/99955

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 2020-03-29
        • 2015-02-02
        • 1970-01-01
        • 2014-08-15
        • 2023-01-26
        相关资源
        最近更新 更多