Search code examples
elisp

Case-insensitive text list sorting


There is a list of "спсВыбора":

("ФайлыКаталоги" "Клиент Проверка Существования Каталога" "Клиент Проверка Существование Файла" "СтандартныеСтруктурыМодуля" "стндОбрОтв" "элКлючаОтветУспехОбрОтв" "элКлючаОтветОшибкаОбрОтв" "элКлючаОтветПроцедура" "элКлючаОтветМодуль" "стндОтчОтв")

To sort, use the command:

(setq спсВыбора (sort спсВыбора (lambda (a b) (string> a b))))

As a result, the list of "спсВыбора":

("элКлючаОтветУспехОбрОтв" "элКлючаОтветПроцедура" "элКлючаОтветОшибкаОбрОтв" "элКлючаОтветМодуль" "стндОтчОтв" "стндОбрОтв" "ФайлыКаталоги" "СтандартныеСтруктурыМодуля" "Клиент Проверка Существования Каталога" "Клиент Проверка Существование Файла")

Sorting takes into account the separate order of lower and upper case letters. Tell me how to sort the list by removing the case order. Example:

"caB" => "aBc"


Solution

  • Use string-collate-lessp as the predicate:

    string-collate-lessp is a built-in function in ‘src/fns.c’.
    
    (string-collate-lessp S1 S2 &optional LOCALE IGNORE-CASE)
    
    Return t if first arg string is less than second in collation order.
    Symbols are also allowed; their print names are used instead.
    
    This function obeys the conventions for collation order in your
    locale settings.  For example, punctuation and whitespace characters
    might be considered less significant for sorting:
    
    (sort '("11" "12" "1 1" "1 2" "1.1" "1.2") 'string-collate-lessp)
      => ("11" "1 1" "1.1" "12" "1 2" "1.2")
    
    The optional argument LOCALE, a string, overrides the setting of your
    current locale identifier for collation.  The value is system
    dependent; a LOCALE "en_US.UTF-8" is applicable on POSIX systems,
    while it would be, e.g., "enu_USA.1252" on MS-Windows systems.
    
    If IGNORE-CASE is non-nil, characters are converted to lower-case
    before comparing them.
    
    To emulate Unicode-compliant collation on MS-Windows systems,
    bind ‘w32-collate-ignore-punctuation’ to a non-nil value, since
    the codeset part of the locale cannot be "UTF-8" on MS-Windows.
    
    If your system does not support a locale environment, this function
    behaves like ‘string-lessp’.