O OP estava muito próximo da edição de /usr/share/i18n/locales/iso14651_t1_common
, mas o truque não é excluir a linha
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
mas para modificá-lo para
<U002E> <RES-1>;IGNORE;IGNORE;<U002E> # 47 .
Por que isso funciona
As instruções IGNORE
especificam que o ponto final (aka período ou caractere <U002E>
) será ignorado ao ordenar as palavras em ordem alfabética. Para fazer seus dotfiles virem primeiro, altere IGNORE
para um símbolo de intercalação que vem antes de todos os outros caracteres. Os símbolos de agrupamento são definidos por linhas como
collating-symbol <something-inside-angle-brackets>
e eles são ordenados pela aparência da linha
<something-inside-angle-brackets>
Na minha cópia de iso14651_t1_common
, o símbolo de ordenação do primeiro lugar é <RES-1>
, que aparece na linha 3458. Se o arquivo for diferente, use o símbolo de intercalação que for ordenado primeiro.
Detalhes sobre a ordenação de caracteres com LC_COLLATE
<U002E>
tem três IGNORE
declarações porque as letras podem ser comparadas várias vezes em caso de empates. Para entender isso, considere minúsculas a
e maiúsculas A
(que fazem parte de um grupo de caracteres que realmente são comparados quatro vezes):
<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A
Ter várias rodadas de comparação permite que os arquivos que começam com "a" e "A" sejam agrupados porque ambos são comparados como <a>
durante a primeira passagem, com a próxima letra determinando a ordem. Se todas as letras a seguir forem iguais (por exemplo, a.txt
e A.txt
), a terceira passagem colocará a.txt
primeiro porque o símbolo de intercalação para letras minúsculas <MIN>
aparece na linha 3467, antes do símbolo de intercalação para maiúsculas letras <CAP>
(linha 3488).
Implementando essa alteração
Se você quiser que o período seja o primeiro todas as vezes que um programa envia cartas usando LC_COLLATE
, você pode modificar iso14651_t1_common
conforme descrito acima e reconstruir seu arquivo de locais. Mas se você quiser fazer essa alteração somente para ls
e sem acesso root, você pode copiar os arquivos de localidade originais para outro diretório antes de modificá-los.
O que eu fiz
Meu idioma padrão é en_US, então copiei en_US
, iso14651_t1
e iso14651_t1_common
para $HOME/path/to/new/locales
. Lá, fiz a alteração mencionada acima para iso14651_t1_common
e renomei en_US
para en_DOTFILE
. Em seguida, eu compilei o código do idioma en_DOTFILE com
localedef -i en_DOTFILE -f UTF-8 -vc $HOME/path/to/new/locales/en_DOTFILE.UTF-8
Para substituir a ordem padrão ls
, crie um script BASH chamado ls
:
#!/bin/bash
LOCPATH=$HOME/path/to/new/locales LANG=en_DOTFILE.UTF-8 ls "$@"
salve-o em algum lugar que apareça antes de /usr/bin
em seu caminho e torne-o executável com chmod +x ls
.