Nemo 文件管理器在排序时完全忽略目录名开头的“_”

Nemo 文件管理器在排序时完全忽略目录名开头的“_”

前任。假设一些目录被命名为

absorbing
appreciate
arrive
connect
depend
drop
few
fold
littlel
popcorn
shrill
sticky

在 Windows 中,如果我放在_目录之前,它将位于顶部,就像这样。

_connect
_few
_little
_shrill
absorbing
appreciate
arrive
depend
drop
fold
popcorn
sticky

然而,在 Nemo 4.0.6 中按字母顺序排序时,相同的目录如下所示(具体来说,Linux Mint 19.1、Cinnamon 4.0.10)

absorbing
appreciate
arrive
_connect
depend
drop
_few
fold
_little
popcorn
_shrill
sticky

因此,Nemo 中的排序算法完全忽略_目录名称的开头。

我希望排序像第一个列表一样工作,有什么办法可以做到这一点吗?

答案1

我在 Linux Mint 19.3 上测试了这个解决方案。

首先继续阅读nemo 文件排序顺序与 /bin/ls 不同有一点背景。

我们有两个步骤:

  1. 修改 Nemo,使其根据我们的区域设置进行排序。
  2. 编辑/usr/share/i18n/locales/iso14651_t1_common区域设置以根据我们的喜好进行排序。

1.修改尼莫

主要指南在GitHub

git clone https://github.com/linuxmint/nemo

现在我们必须编辑nemo/libnemo-private/nemo-file.c

消除:

/* Files that start with these characters sort after files that don't. */
#define SORT_LAST_CHAR1 '.'
#define SORT_LAST_CHAR2 '#'

代替:

static int
compare_by_display_name (NemoFile *file_1, NemoFile *file_2)
{
    const char *name_1, *name_2;
    const char *key_1, *key_2;
    gboolean sort_last_1, sort_last_2;
    int compare=0;

    name_1 = nemo_file_peek_display_name (file_1);
    name_2 = nemo_file_peek_display_name (file_2);

    sort_last_1 = name_1 && (name_1[0] == SORT_LAST_CHAR1 || name_1[0] == SORT_LAST_CHAR2);
    sort_last_2 = name_2 && (name_2[0] == SORT_LAST_CHAR1 || name_2[0] == SORT_LAST_CHAR2);

    if (sort_last_1 && !sort_last_2) {
        compare = +1;
    } else if (!sort_last_1 && sort_last_2) {
        compare = -1;
    } else if (name_1 == NULL || name_2 == NULL) {
        if (name_1 && !name_2)
            compare = +1;
        else if (!name_1 && name_2)
            compare = -1;
    } else {
        key_1 = nemo_file_peek_display_name_collation_key (file_1);
        key_2 = nemo_file_peek_display_name_collation_key (file_2);
        compare = g_strcmp0 (key_1, key_2);
    }

    return compare;
}

和:

static int
compare_by_display_name (NemoFile *file_1, NemoFile *file_2)
{
    const char *key_1, *key_2;
    int compare=0;

    key_1 = nemo_file_peek_display_name_collation_key (file_1);
    key_2 = nemo_file_peek_display_name_collation_key (file_2);
    compare = strcmp (key_1, key_2);

    return compare;
}

并替换:

file->details->display_name_collation_key = g_utf8_collate_key_for_filename (display_name, -1);

和:

file->details->display_name_collation_key = g_utf8_collate_key (display_name, -1);

现在打开源代码存储库在软件源中。

然后在nemo目录中发出以下命令:

sudo apt-get build-dep nemo 
dpkg-buildpackage 
cd .. && sudo dpkg -i *.deb

然后ctrlaltbackspace重新启动Xorg。

在此输入图像描述

2. 修改iso14651_t1_common

以管理员身份打开/usr/share/i18n/locales/iso14651_t1_common

代替:

<U005F> IGNORE;IGNORE;IGNORE;<U005F> # 33 _ 

和:

<U005F> <RES-2>;IGNORE;IGNORE;<U005F> # 33 _

跑步sudo locale-gen

致谢

  1. 迈克尔·韦伯斯特,教我从源代码构建 Nemo

  2. bjd-pfq发现了g_utf8_collat​​e_key_for_filename 的问题

  3. 史蒂文·徐引导我走向修补尼莫

  4. 帮助我理解的两篇文章 /usr/share/i18n/locales/iso14651_t1_common豆浸。答案是,如何使“ls”首先显示点文件,同时保持不区分大小写?&使用 LC_COLLATE 指定排序顺序,因此小写字母在大写字母之前

聚苯乙烯该答案的先前版本可以在修订

相关内容