Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Переключение кодировок по F8 #16

Closed
DM-VLK opened this issue Dec 9, 2022 · 11 comments
Closed

Переключение кодировок по F8 #16

DM-VLK opened this issue Dec 9, 2022 · 11 comments

Comments

@DM-VLK
Copy link

DM-VLK commented Dec 9, 2022

Заметил что F8 в редакторе (и в родителе тоже) переключает между кодировками 1252/437, а не 1251/866 как в Windows версии FAR. Возможно ли сделать поведение аналогично Windows версии или так сделано специально?

@DM-VLK
Copy link
Author

DM-VLK commented Dec 9, 2022

Ради интереса переключил язык/локаль системы на русские и поведение стало таким как нужно, но например Windows у меня английская, форматы Russian(Ukraine) и язык FAR’a английский, а кодировки по F8 какие и нужно. Можно ли как-то настроить это поведение?

Сейчас у меня язык en_US, а форматы ru_UA

@shmuz
Copy link
Owner

shmuz commented Dec 9, 2022

Не вникал в этот вопрос, у меня 1251/866 (как это получилось уже не помню.
Редактор настроен на UTF-8 для новых файлов, так что если пишу на русском, то это всегда UTF-8.

@DM-VLK
Copy link
Author

DM-VLK commented Dec 9, 2022

Вышло починить. Запуск LC_ALL=ru_RU.UTF-8 far2l ожидаемо дал нужное поведение, а потом я поискал в исходниках и нашел нужное место.

В файле APIStringCodepages.cpp заменил 221-ю строку на

const char *lc = setlocale(LC_NUMERIC, NULL);

Выбрал LC_NUMERIC, вроде вполне разумно.

После 338-й строки вставил

if (IsLocaleMatches(lc, "ru_UA")) { return Codepages{866, 1251}; }

А можно добавить условие, что если локаль начинаеться с ru_ ставить страницы 866/1251

@shmuz
Copy link
Owner

shmuz commented Dec 9, 2022

Мне бы не хотелось иметь в исходниках жёстко-закодированные правила. Лучше такое выносить в конфигурацию.
Но это я так, в общем, не разбираясь в проблеме (у меня-то такой проблемы почему-то нет).
Пусть данный тикет побудет открытым, возможно со временем поймём, что надо (или не надо) делать.

@DM-VLK
Copy link
Author

DM-VLK commented Dec 9, 2022

Но ведь оно и так есть жестко закодированным и там по строке для каждой локали и куча if-ов, а я просто еще одну добавил. Единственное где меняется поведение это чтобы локаль проверялась не LC_CTYPE, а LC_NUMERIC. «Проблема» возникнет только у тех у кого система на одном языке (чаще всего английский), а форматы от другого (например начало недели с воскресенья как в США явно неудобно). Прошу вас добавить изменение т.к. не хотелось бы менять вручную каждый раз. Windows версия обрабатывает этот момент правильно.

У меня вывод команды locale такой:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=ru_UA.UTF-8
LC_TIME=ru_UA.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=ru_UA.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=ru_UA.UTF-8
LC_NAME=ru_UA.UTF-8
LC_ADDRESS=ru_UA.UTF-8
LC_TELEPHONE=ru_UA.UTF-8
LC_MEASUREMENT=ru_UA.UTF-8
LC_IDENTIFICATION=ru_UA.UTF-8

@shmuz
Copy link
Owner

shmuz commented Dec 9, 2022

У нас в Израиле тоже неделя начинается с воскресенья :)
А по существу смогу ответить, когда разберусь (сейчас занимаюсь другой проблемой и не могу переключаться).
Поэтому просьба подождать. Тикет открыт, значит я к нему буду возвращаться.

@shmuz
Copy link
Owner

shmuz commented Dec 11, 2022

В файле APIStringCodepages.cpp заменил 221-ю строку на
const char *lc = setlocale(LC_NUMERIC, NULL);
Выбрал LC_NUMERIC, вроде вполне разумно.

Когда 2-й параметр==NULL, изменений в текущей локали не делается, это может только повлиять на возвращаемое значение (https://cplusplus.com/reference/clocale/setlocale/). Поэтому смысла в данном изменении нет.

if (IsLocaleMatches(lc, "ru_UA")) { return Codepages{866, 1251}; }

Это можно добавить.

А можно добавить условие, что если локаль начинаеться с ru_ ставить страницы 866/1251

Технически добавить легко, но не хотелось бы умножать в программе куски, заточенные на определённый (в данном случае, русский) язык.

@shmuz shmuz closed this as completed in 26a9c1e Dec 12, 2022
@DM-VLK
Copy link
Author

DM-VLK commented Dec 14, 2022

В файле APIStringCodepages.cpp заменил 221-ю строку на
const char *lc = setlocale(LC_NUMERIC, NULL);
Выбрал LC_NUMERIC, вроде вполне разумно.

Когда 2-й параметр==NULL, изменений в текущей локали не делается, это может только повлиять на возвращаемое значение (https://cplusplus.com/reference/clocale/setlocale/). Поэтому смысла в данном изменении нет.

Увы, но так не работает (я собрал новую версию). Вот если бы в каждой строке команды locale у меня было ru_UA.UTF-8, то это бы сработало, но так по прежнему проверяется LC_CTYPE которая будет иметь значение en_US. Именно и нужно чтобы в переменной lc было значение LC_NUMERIC. Тем у кого язык и форматы одинаковы вообще не важно какую из переменных locale проверять, а вот в таком случае как у меня появляется разница.

@shmuz
Copy link
Owner

shmuz commented Dec 14, 2022

Решение оказалось уже предусмотренным.
Создайте файл ~/.config/far2l/cp, в нём поместите 2 строчки:

866
1251

Перезапустите Фар.

@DM-VLK
Copy link
Author

DM-VLK commented Dec 28, 2022

Решение оказалось уже предусмотренным

Спасибо. Стоит добавить в справку/FAQ

@shmuz
Copy link
Owner

shmuz commented Dec 28, 2022

Стоит добавить в справку/FAQ

  • Pull request не был бы лишним :)
    Если возьмётесь, то модифицироваться должны файлы FarUkr.hlf.m4 FarRus.hlf.m4 FarEng.hlf.m4
  • Или создать для этого новый Issue, чтобы не забылось

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants