Автор Гілка: Сортування в Emacs  (Прочитано 10328 раз)

Axmed

  • Гість
Сортування в Emacs
« : 2021-07-23 12:39:54 »
В Emacs є така вада, якщо посортувати список командою =M-x sort-lines=, то
букви є, і, ї, ґ попадають в кінець списку.

Приклад:
до
індик
горобець
абориґен
єнот
їжак
ґава
ящірка
окунь

після
абориґен
горобець
окунь
ящірка
єнот
індик
їжак
ґава

Логіка програміста підказує мені, що то інтерпретатор elisp так сортує і не все
так просто. Можливо треба змінити щось в цих файлах:
https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/language/cyrillic.el
https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/language/cyril-util.el
https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/international

А можливо то не в Емаксі проблема, бо в мене інтерпретатор Raku (тобто Perl)
також так сортує. Але стандартними утилітами командного рядка bash сортує
нормально.
$ raku -e'say sort "і","ї","є","ґ","я","а","г","о"'
(а г о я є і ї ґ)

Чому так відбувається і в який бік копати і чи є якась хитрість, щоб обійти цю
проблему? (як варіянт можна написати свою бібліотеку ~sort.el~, але для цього
мені треба вивчити elisp, а це буде не скоро).

Якщо проблема не вирішиться, то це повідомлення буде нагадуванням на майбутнє.

Відсутній Re.

  • Загальний модератор
  • Літератор
  • *****
  • дописів: 1898
  • Карма: +1/-0
Re: Сортування в Emacs
« Відповідей #1 : 2021-07-31 00:01:06 »
Це мені нагадує цю тему. Сам не використовую Emac, тому не підкажу детальніше.

Axmed

  • Гість
Re: Сортування в Emacs
« Відповідей #2 : 2021-07-31 02:03:42 »
Це мені нагадує цю тему. Сам не використовую Emac, тому не підкажу детальніше.
Дякую, також вийшов на бібліотеку glibc. Воно сортує в кодуванні UTF-8 згідно таблиці Unicode. Логічно? Логічно. Звісно, таблицю Unicode ніхто змінювати не буде, думаю, воно вирішується переписуванням файлу sort.el (або всякими латками до нього), але чисто для себе можна спробувати в файлі UTF-8 переставити назви літер на інші кодові точки і потім все зібрати. Але я ще не пробував, тому не знаю.

Відсутній DalekiyObriy

  • Літератор
  • ******
  • дописів: 1929
  • Карма: +5/-0
Re: Сортування в Emacs
« Відповідей #3 : 2021-08-03 19:02:02 »
glibc має підтримку української локалі, і якщо її вибрати сортування всіх літер має відбуватися правильно (дякувати Володимиру) тож можливо вам треба задати локаль перед запуском emacs?
Fedora 35 (x86-64)

Axmed

  • Гість
Re: Сортування в Emacs
« Відповідей #4 : 2021-08-04 11:33:31 »
glibc має підтримку української локалі, і якщо її вибрати сортування всіх літер має відбуватися правильно (дякувати Володимиру) тож можливо вам треба задати локаль перед запуском emacs?

таким макаром не працює
$ LANG=uk_UA.UTF-8 emacs
$ LANGUAGE=uk emacs

схоже алгоритм сортування emacs працює в обхід локалей.

Відсутній RomadinR

  • Кореспондент
  • ***
  • дописів: 123
  • Карма: +0/-0
Re: Сортування в Emacs
« Відповідей #5 : 2021-08-04 15:05:31 »
Спробуйте у файлі .emacs.el додати (setenv "LANG" "uk_UA.UTF-8")

Axmed

  • Гість
Re: Сортування в Emacs
« Відповідей #6 : 2021-08-04 21:23:10 »
Спробуйте у файлі .emacs.el додати (setenv "LANG" "uk_UA.UTF-8")
Не робе. Воно й без того бачить змінну "LANG". Це можна глянути через =f1-v initial-environment=.
(… "LANG=uk_UA.UTF-8" …)
З локалями в мене, ніби, все добре
$ locale
LANG=uk_UA.UTF-8
LANGUAGE=
LC_CTYPE="uk_UA.UTF-8"
LC_NUMERIC="uk_UA.UTF-8"
LC_TIME="uk_UA.UTF-8"
LC_COLLATE="uk_UA.UTF-8"
LC_MONETARY="uk_UA.UTF-8"
LC_MESSAGES="uk_UA.UTF-8"
LC_PAPER="uk_UA.UTF-8"
LC_NAME="uk_UA.UTF-8"
LC_ADDRESS="uk_UA.UTF-8"
LC_TELEPHONE="uk_UA.UTF-8"
LC_MEASUREMENT="uk_UA.UTF-8"
LC_IDENTIFICATION="uk_UA.UTF-8"
LC_ALL=

Ставив на спеціяльно встановлену німецьку систему, з німецькими локалями. І там
також слова на ä, ü складає в кінець списку. Так що так має бути.. це
глобальна проблема.

Відсутній RomadinR

  • Кореспондент
  • ***
  • дописів: 123
  • Карма: +0/-0
Re: Сортування в Emacs
« Відповідей #7 : 2021-08-06 13:39:22 »
Спробуйте (setenv "LC_ALL" "uk_UA.UTF-8"), вона повинна перекрити всі LC_* і не давати їх змінити. З LANG змінити можна, якщо з якогось дива при запуску програми десь чомусь поставиться "С". Дуже сумнівно, щоб в Emacs використовувалася власна бібліотека замість системної, а от поправити налаштування локалі для чогось на "С" - десь може бути.

Axmed

  • Гість
Re: Сортування в Emacs
« Відповідей #8 : 2021-08-11 00:52:06 »
Спробуйте (setenv "LC_ALL" "uk_UA.UTF-8"), вона повинна перекрити всі LC_* і не давати їх змінити.
Не робе.

Дуже сумнівно, щоб в Emacs використовувалася власна бібліотека замість системної, а от поправити налаштування локалі для чогось на "С" - десь може бути.
Схоже Emacs має власні засоби для створення символьних мап (називається MULE), а з бібліотеки glibc бере лише деякі готові файли з кодуваннями. Скрипти для створення символьних мап знаходяться в оф. репозиторії (тут), локальна тека з готовими мапами тут: /usr/share/emacs/26.1/etc/charsets.

Придумав тимчасове рішення через зовнішню команду sort.
(defun sortl ()
  "Сортує рядки командою оболонки sort."
  (interactive)
  (let ((beg (region-beginning))
(end (region-end))
(buf "*Shell Command Output*")))
  (shell-command-on-region beg end "sort")
  (delete-region beg end)
  (insert-buffer buf)
  (goto-char end)
  (kill-buffer buf))
Вставляєте функцію у свій init-файл, і потім можна виділяти текст і сортувати командою =M-x sortl=.