Comments (42)
Всё выяснилось, в KDE у меня стоит регион en_GB
если запустить far2l как
env LC_ALL=en_GB.UTF-8 far2l
то поиск не работает
если
запустить как
env LC_ALL=en_US.UTF-8 far2l
то поиск работает
вообще это странный эффект, пока не понятно почему это происходит чем именно локаль en_US отличается от en_GB так чтобы влиять на поиск в русской кодировке
как быстрый фикс этой проблемы, - выглядит так что far2l должен иметь более сложную логику работы в локалями в случае если определена
LC_COLLATE=ru_RU.UTF-8
а
LC_ALL=en_GB.UTF-8
то нужно менять LC_ALL на LC_ALL=en_US.UTF-8
то что я вижу сейчас это как будто LC_COLLATE вообще не влияет на FAR2l
поиск не работает:
env LC_ALL=en_GB.UTF-8 env LC_COLLATE=en_US.UTF-8 far2l
env LC_ALL=en_GB.UTF-8 env LC_COLLATE=ru_RU.UTF-8 far2l
поиск работает:
env LC_ALL=en_US.UTF-8 env LC_COLLATE=en_US.UTF-8 far2l
env LC_ALL=en_US.UTF-8 env LC_COLLATE=ru_RU.UTF-8 far2l
from far2l.
а у вас KDE нет попробовать то же самое?
Сейчас попробовал (Manjaro-KDE-Plasma) - проблема воспроизвелась.
Попробовал также плагином LF Search под far2m - при использовании движков поиска PCRE или Oniguruma проблемы нет, при использовании движка Far проблема есть.
from far2l.
У меня не воспроизводится - всё ищется правильно.
from far2l.
У меня не воспроизводится - всё ищется правильно.
Во вложении видео.
У вас в окружении какая локаль стоит и как вы far2l запускаете?
мое окружение
LC_MONETARY=ru_RU.UTF-8
LC_MEASUREMENT=ru_RU.UTF-8
LC_TIME=en_GB.UTF-8
LC_ALL=en_US.UTF-8
LC_COLLATE=ru_RU.UTF-8
и нет других локалей в строке запуска far2l
far2lsearh.mp4
from far2l.
Моё окружение:
LANGUAGE=en_US:
LANG=en_US.UTF-8
LC_ADDRESS=ru_RU.UTF-8
LC_NAME=ru_RU.UTF-8
LC_MONETARY=ru_RU.UTF-8
LC_PAPER=ru_RU.UTF-8
LC_IDENTIFICATION=ru_RU.UTF-8
LC_TELEPHONE=ru_RU.UTF-8
LC_MEASUREMENT=ru_RU.UTF-8
LC_TIME=ru_RU.UTF-8
LC_NUMERIC=ru_RU.UTF-8
также прописано в ~/.config/far2l/cp
866
1251
Заменил в окружении export LC_ALL, LC_COLLATE и LC_TIME на значения как у @LanThrusteR и запустил far2l. Поиск это не сломало.
Интересный баг.
from far2l.
866
1251
то же самое прописано
linux-vdso.so.1 (0x00007ffe4f7ad000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f458926d000)
libuchardet.so.0 => /usr/lib64/libuchardet.so.0 (0x00007f458923b000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f458921b000)
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.1/libstdc++.so.6 (0x00007f4588ffb000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4588eb7000)
libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.1/libgcc_s.so.1 (0x00007f4588e98000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4588cda000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4589615000)
интересно в чем дело, в окружении или в чем то ещё, может libuchardet влиять на поиск?
Какая версия у вас libuchardet?
У меня 0.0.7
from far2l.
Какая версия у вас libuchardet?
У меня 0.0.7
У меня в Ubuntu 22.04.4 LTS всё симлинчится на libuchardet.so.0.0.7
from far2l.
Какая версия у вас libuchardet?
У меня 0.0.7У меня в Ubuntu 22.04.4 LTS всё симлинчится на libuchardet.so.0.0.7
что интересно:
если запускать far2l из KDE лаунчера : поиск не работает
если запустить konsole и из неё запустить far2l : поиск работает
если запустить из лаунчера konsole -e far2l : поиск не работает
т.е. пока всё свелось к тому как пускать far2l, если его пускать через лаунчер - то поиск не работает, если его пускать
из любого терминала - то поиск работает....
хотя локали и переменные те же самые с виду если в far2l выдать env то видишь те же локали, попробую разобраться от чего именно это зависит от какой то переменной окружения или от чего, пока не ясно
from far2l.
И я тут видел баг по локациям и быстрым клавишам если правильно помню, та же история т.е. если нет
env LC_ALL=en_US.UTF-8 far2l
или
env LC_ALL=ru_RU.UTF-8 far2l
то если например текущая раскладка RU и нажать Alt + F1 и если локациям заданы латинские буквы (например L), то если нажать L (т.е. русскую д на текущий момент) то не сработает переключение, т.е. нужно переключить раскладку в латинскую и затем доступ к локацям по букве L заработает
т.е.
LC_COLLATE=ru_RU.UTF-8
игнорируется far2l
PS и вот теперь и быстрый поиск по файлам (Alt + буквы) заработал по файлам с латинскими имненами но в при этом текущая раскладка RU, т.е. это всё одна проблема
from far2l.
Внутри far2l явно кодовые страницы определяются из ~/.config/far2l/cp
или при его отсутствии по LC_CTYPE
(см. DeduceCodepages()
в WinPort/src/APIStringCodepages.cpp). Очень странно как проползает влияние LC_ALL
даже при наличии ~/.config/far2l/cp
🤯
Наверное тему стоит переименовать в "Nonlatin letters search problem with LC_ALL non en_US.UTF8 or non ru_RU.UTF-8" или вот что-то подобное?
from far2l.
если запустить far2l как
env LC_ALL=en_GB.UTF-8 far2l
то поиск не работает
Странно, но у меня работает (и far2l, и far2m).
from far2l.
если запустить far2l как
env LC_ALL=en_GB.UTF-8 far2l
то поиск не работаетСтранно, но у меня работает (и far2l, и far2m).
А чему у вас равно LC_CTYPE?
from far2l.
А чему у вас равно LC_CTYPE?
Оно не выставлено, просто нет такой переменной.
Если запускаю
env LC_ALL=en_GB.UTF-8 LC_CTYPE=en_GB.UTF-8 ~/far2l/_build/install/far2l
то ваш пример поиска всё равно работает правильно.
from far2l.
Есть ещё интересное наблюдение, если в
./far2l-v_2.6.0/far2l/src/main.cpp
закоментировать
// setlocale(LC_ALL, ""); // otherwise non-latin keys missing with XIM input method
то становится все равно как запускать
env LC_ALL=en_GB.UTF-8 far2l
или
env LC_ALL=en_US.UTF-8 far2l
всегда НЕ РАБОТАЕТ, т.е. видимо в этом где то и есть проблема, нужно ещё где то установить
setlocale(LC_ALL, ""); // otherwise non-latin keys missing with XIM input method
пока не понятно почему так происходит, т.е. если я убираю
setlocale(LC_ALL, ""); // otherwise non-latin keys missing with XIM input method
*я нахожус в KDE
то проблема вообще всегда существует и её нельзя исправить
env LC_ALL=en_US.UTF-8 far2l
между тем я не наблюдаю проблемы в комментарии
// otherwise non-latin keys missing with XIM input method
т.е. во всяком случае русские UTF-8 символы - работают как работали, из под X но если эту строку убрать - то проблема на видео происходит всегда и её не возможно (или пока не найдено как) обойти
но если это строка есть - то решается с помощью
env LC_ALL=en_US.UTF-8 far2l
но в .bashrc прописано
export LC_ALL="en_US.UTF-8"
(возможно главное чтобы не совпадало с локалью, выставленной в KDE)
from far2l.
А чему у вас равно LC_CTYPE?
Оно не выставлено, просто нет такой переменной. Если запускаю
env LC_ALL=en_GB.UTF-8 LC_CTYPE=en_GB.UTF-8 ~/far2l/_build/install/far2l
то ваш пример поиска всё равно работает правильно.
осмелюсь предположить что что вы FAR2L не под X Windows пробуете а через терминал т.е. не из под Xов
from far2l.
осмелюсь предположить что что вы FAR2L не под X Windows пробуете а через терминал т.е. не из под Xов
Запускаю из терминала (GNOME Terminal) WX-вариант far2l, т.е. появляется отдельное от терминала окно.
from far2l.
осмелюсь предположить что что вы FAR2L не под X Windows пробуете а через терминал т.е. не из под Xов
Запускаю из терминала (GNOME Terminal) WX-вариант far2l, т.е. появляется отдельное от терминала окно.
да, это странно, может быть в гноме этого нет, а у вас KDE нет попробовать то же самое?
from far2l.
если
запустить как
env LC_ALL=en_US.UTF-8 far2l
то поиск работает
очень весёлая история. потому что у меня так -- НЕ работает как раз. :)
from far2l.
если
запустить как
env LC_ALL=en_US.UTF-8 far2l
то поиск работаеточень весёлая история. потому что у меня так -- НЕ работает как раз. :)
Возможно что локаль должна не совпадать с той что указана в настройках KDE (LC_ALL), у меня работает и вариант
env LC_ALL=ru_RU.UTF-8 far2l
попробуйте
from far2l.
Итак
setlocale(LC_ALL, "");
в исходниках main.cpp говорить что мы должны использовать локаль системы, которая в моем случае en_GB
Если мы её переопределяем через
env LC_ALL=ru_RU.UTF-8 far2l
far2l рабоатет
env LC_ALL=en_US.UTF-8 far2l
far2l рабоатет! (хотя не должен)
from far2l.
мой
locale
LANG=en_GB.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
~/.bashrc
export LC_ALL="en_US.UTF-8"
from far2l.
Просто оставлю здесь: обнуление LC_ALL появилось в main() вот с этого коммита: fd01af6 ещё от Sep 2, 2016
from far2l.
Немного копнул как оно внутри устроено 🤯. Поиск делается через SearchString()
из strmix.cpp внутри которой при !Case
делается приведение Upper(Ch) != Upper(Str[J])
. Где Upper() inline-ка из locale.hpp, которая для не ASCII символов дергает CharUpperBuff
из APIStringMap.cpp и уже внутри которой зарыта
return WINPORT(LCMapString)( LOCALE_USER_DEFAULT, LCMAP_UPPERCASE, str, len, str, len );
и вот уже в LCMapStringEx()
при flags & LCMAP_UPPERCASE
дергается из стандартной библиотеки towupper()
, которая и даёт сюрпризы этого issue.
UPD: Гугление показало, что из такого towupper()
костылятся явным указанием локали при или перед приведением регистра:
std::toupper(c,loc)
- linktoupper(c, std::locale(""))
- link- либо двустрочником
std::setlocale(LC_ALL, "ru_RU.utf8"); std::towupper(с);
- link
Причём во всех случаях локаль должна корректно стоять в системе.
Как тут корректно решать проблему топикстартера не соображу.
from far2l.
Причём во всех случаях локаль должна корректно стоять в системе.
Как тут корректно решать проблему топикстартера не соображу.
Тут есть ещё одна загадка, логика строки в main.cpp
setlocale(LC_ALL, "");//otherwise non-latin keys missing with XIM input method
говорить stdlib использовать локаль из окружения, т.е. кажется что это сделано правильно какие бы причины ни были в начале,
тогда почему в моем случае
работает
env LC_ALL=en_US.UTF-8 far2l
env LC_ALL=ru_RU.UTF-8 far2l
и не работает
env LC_ALL=en_GB.UTF-8 far2l
казалось бы в случае
LANG=en_GB.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
~/.bashrc
export LC_ALL="en_US.UTF-8"
не должно работать оба варианта, и тем ни менее
from far2l.
Если закомментировать
setlocale(LC_ALL, "");//otherwise non-latin keys missing with XIM input method
то начинает логично работать, не работает:
env LC_ALL=en_US.UTF-8 far2l
env LC_ALL=en_GB.UTF-8 far2l
работает:
env LC_ALL=ru_RU.UTF-8 far2l
Чтобы эту проблему решить навсегда, предлагаю вместо
setlocale(LC_ALL, "");//otherwise non-latin keys missing with XIM input method
при старте делать опрос альтернативных раскладок и если есть вторая раскладка (и только если их две) то вместо
setlocale(LC_ALL, "");//otherwise non-latin keys missing with XIM input method
прописывать локаль альтернативной раскладки
setlocale(LC_ALL, DETECTED_ALTERNATIVE_LOCALE);
и тогда это зло отступит
from far2l.
И даже есть ещё интересная находка что если закомментировать
setlocale(LC_ALL, "");//otherwise non-latin keys missing with XIM input method
то работает и
env LC_COLLATE=ru_RU.UTF-8 far2l
т.е. чтобы поправить эту проблему нужно после
setlocale(LC_ALL, "");//otherwise non-latin keys missing with XIM input method
сделать
setlocale(LC_COLLATE, DETECTED_ALTERNATIVE_LAYOUT_LOCALE);//otherwise non-latin keys missing with XIM input method
где
DETECTED_ALTERNATIVE_LAYOUTE_LOCALE : это альтернативная локаль (если есть) которая используется при перключении клавиатуры (в случае если две - что является подавляющем большинством случаев) т.е. в моем случае это выглядело бы как
setlocale(LC_ALL, "");//otherwise non-latin keys missing with XIM input method
setlocale(LC_COLLATE, "ru_RU.UTF-8");
т.е. нужно добавить после LC_ALL установку LC_COLLATE, как вариант упрощенный, чтобы не связываться с определением альтернативной расскладки, можно из окружения брать LC_COLLATE и задавать её после
setlocale(LC_ALL, "");//otherwise non-latin keys missing with XIM input method
setlocale(LC_COLLATE, CURRENT_LC_COLLATE_FROM_ENVIRONMENT);
from far2l.
вот этот патч решит проблему для большинства пользователей:
заменить
setlocale(LC_ALL, ""); // otherwise non-latin keys missing with XIM input method
на
setlocale(LC_ALL, ""); // otherwise non-latin keys missing with XIM input method
setlocale(LC_COLLATE, getenv("LC_COLLATE"));
--- /var/tmp/portage/app-misc/far2l-2.6.0_beta/work/far2l-v_2.6.0/far2l/src/.main.cpp 2024-02-19 22:32:19.000000000 +0300
+++ /var/tmp/portage/app-misc/far2l-2.6.0_beta/work/far2l-v_2.6.0/far2l/src/main.cpp 2024-03-09 18:59:32.000000000 +0300
@@ -759,6 +759,7 @@
umask(g_umask);
setlocale(LC_ALL, ""); // otherwise non-latin keys missing with XIM input method
+ setlocale(LC_COLLATE, getenv("LC_COLLATE"));
SetupFarPath(argv[0]);
from far2l.
хм ревертнуть чтоли 786400a...
from far2l.
как оно ща?
from far2l.
как оно ща?
Хм. Перестало искать в тех же условиях, в каких раньше искало в принципе.
Чекбокс "Учитывать регистр" снят, искомая строка "забросил", в тексте встречается "Забросил":
╔══════ Поиск ══════╗
║ Строка не найдена ║
║ "забросил" ║
╟───────────────────╢
║ { OK } ║
╚═══════════════════╝
Файл -- LF, UTF-8.
$ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
from far2l.
ой. а сейчас?
from far2l.
ой. а сейчас?
данная регрессия пропала, в дефолтных условиях снова ищется.
насчёт остального в треде -- это надо проверять...
from far2l.
Related Issues (20)
- far2l fails to connect to FTP HOT 9
- Support kovidgoyal's kitty keyboard protocol in VT
- help needs update HOT 5
- Ctrl+Shift+Arrow_key keypresses do not work in kovidgoyal's kitty
- string is appended to clipboard rather then replacting it (on Ctrl+C in kitty)
- strange bug with clipboard and kitty HOT 1
- ttyx module replacement for Wayland API HOT 6
- disable ttyxi input processing (but not clipboard access!) under wayland HOT 12
- Ctrl+1,2,3..0 do not work in ttyxi in GNome Terminal on Wayland systems HOT 4
- Import new Colorer schemes for shell POSIX and shell bash HOT 2
- проблема с прорисовкой результата поиска файлов HOT 10
- Нет запроса на повышение прав если FAR2L запущен после FAR2M HOT 1
- Use kioclient to move files into Trash on KDE
- Can't move files with backslash in name to Trash
- far2l падает при запуске любой консольной команды HOT 7
- Migrate from pcre to pcre2 library
- Copy-Paste between far2l wx and Telegram Desktop not working under Wayland on Ubuntu 23.10 HOT 15
- make input wait timeouts in ttyxi customizable; default to 100ms for ssh
- Weird bug after canceling Privilege elevation and subsequent Retry attempt HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from far2l.