far2l
far2l copied to clipboard
Add optional case-insensitive comparison of file masks
Хорошо бы добавить опциональную возможность регистронезависимого сравнения имён файлов. Пригодилось бы во многих диалогах -- и в пометке, и в настройках раскраски, и в поиске (как это сделано в Midnight Commander, например).
Скажем, сейчас маски в настройках раскраски, предлагаемые "из коробки", не учитывают, что архив или исполняемый файл могут иметь расширения в верхнем регистре, и не подсвечивают их нужным образом. А такие имена не редкость, особенно для файлов, перекочевавших из Windows или DOS.
Приходится каждый раз шаманить с регулярными выражениями, это, конечно, workaround, но регистронезависимый чекбокс сильно облегчил бы жизнь.
Один общий чекбокс в настройках на все диалоги с масками пойдет? А то много их слишком, загромождать..
Ну в идеале, конечно, хотелось бы иметь независимые чекбоксы хотя бы в трёх перечисленных выше кейсах. Но если малой кровью, то да, хотя бы опцию в настройках такую предусмотреть.
Учет регистра при Сравнении папок и пометке по Gray+/- теперь настраивается в F9->Параметры->Настройки панели->[x] Учитывать регистр при сравнении или пометке
. Насколько объединение этих двух случаев в один чекбокс удобно?
Для поиска наверное стоит свой отдельный чекбок уже внутри диалога по Alt+F7 или как?
Насколько объединение этих двух случаев в один чекбокс удобно?
Могу говорить только за себя — мне это неудобств не доставляет (просто потому, что для сравнения папок обычно использую плагин Advanced Compare). Хотя, конечно, семантически это разные операции, так что раздельные чекбоксы были бы логичнее.
Если наберётся достаточное кол-во операций с опциями для (не)учитывания регистра, можно потом вообще чекбоксы эти вынести в отдельный диалог настроек.
Для поиска наверное стоит свой отдельный чекбок уже внутри диалога по Alt+F7 или как?
Ну, в mc в поиске две отдельные галочки для этого, наверное, можно как-то по аналогии.
Ну, в mc в поиске две отдельные галочки для этого, наверное, можно как-то по аналогии.
В mc визуально логично - левая колонка имя/маска, правая - содержимое.
В far примерно также, но напрашиваются 2 варианта размещения дополнительного пункта [ ] Case sensitive (file mask)
:
- позиция 1 - сразу под маской
- позиция 2 - сверху второй колонки параметров (где вроде галочки именно по области поиска).
Какой вариант вабрать?
И как (пере|по)именовать две похожих галочки:
- текущая про текст:
[ ] Case sensitive (text)
- новая:
[ ] Case sensitive (file mask)
или более коротко[ ] Case sensitive (mask)
?
- позиция 1 - сразу под маской
- позиция 2 - сверху второй колонки параметров (где вроде галочки именно по области поиска).
Какой вариант вабрать?
позиция 2, имхо, будет смотреться более элегантно; но это только имхо.
И как (пере|по)именовать две похожих галочки
[ ] Case sensitive (text)
и [ ] Case sensitive (mask)
, наверное. Возможно только, не "text", а "pattern"?
Возможность (Не)учитывания регистра имён файлов при сравнении и пометках #2261 и поиске файлов из #2265 вмержены. Выявляйте странности на файлах поименованных на разных языках.
Сейчас в Compare folders честный выбор вызова StrCmp
или StrCmpI
и они работают как ожидается.
А вот в FindFile и пометке Gray+/Gray- закодил тупую логику - перед сравнением приводится и маска и имя файла к нижнему регистру. Однако, если для ASCII это вроде всегда работает, то для русских имён похоже не работает, например у меня *проект*.*
находит и оба файла и проект, и Проект при любом положении галочки.
К тому же судя по Notes из https://en.cppreference.com/w/cpp/string/wide/towlower встречаются языки, где нет однозначности приведения к другому регистру.
В общем как-то полукостыльно работает. Ищутся идеи как улучшить.
Похоже, дело не в языке. В таком виде оно и для ASCII толком не работает, по маске *Algo*
, например, со включённой галкой "Учитывать регистр", находит файлы
Advance algorithms.Hastad.ps
Advanced Algorithms.ps
algoritms.zip
Но для расширений, как будто, срабатывает нормально, и пока не до конца разобрался, почему. 🤔
Основной процессинг, видимо, производится в CmpName_Body, и она там внутри себя кастует всё к верхнему регистру.
Думаю, можно было бы перенести логику регистро(не)зависимого сличения с маской в саму CmpName_Body.
Ну, скажем, в строке https://github.com/elfmz/far2l/blob/64af534152606d99d4a4376fa6fc26b9c321f4e6/far2l/src/mix/processname.cpp#L257 при сравнении с учётом регистра делать проверку:
if (patternc != stringc)
Но её функция-враппер CmpName используется ещё в ряде мест (не в очень большом, но всё же), это нужно переделывать сигнатуры и все вызовы. 👀
@elfmz
Тогда, видимо, нужно будет, как минимум, модифицировать сигнатуры (добавить в параметры какой-нибудь "bool IgnoreCase=true") :
ну и скорректировать, где понадобится, их вызовы. 👀
И есть ещё одна трабла в текущем варианте кода: в масках ведь могут задаваться и регулярные выражения.
Если галочка "Учитывать регистр" снята, то они будут принудительно кастованы к нижнему регистру, в результате может поменяться их смысл.
Типа:
\I - не буква
вдруг становится
\i - буква
Дальнейшие обсуждения в https://github.com/elfmz/far2l/issues/2275.