Макрос добавляет в диалог поиска файлов (
AltF7) немного "искусственного интеллекта".
Основная его задача — вернуть поведение, присутствующее в версиях фара вплоть до 1.71 alpha 4 build 2368:
если маска, введенная пользователем, не содержит символов '?', '*' и '.', то FAR к введенному пользователем значению добавляет символ '*' и производит поиск по измененной маске.
Если введённая пользователем строка начинается со слеша
/
, то макрос полагает, что это регэксп, и предоставляет дополнительную функцию: при отсутствии завершающего слеша он добавляется, вместе с модификатором
/i
(регистронезависимый поиск).
Макрос реализован как
обработчик события закрытия диалога.
local F = far.Flags
local FindFileId = "8C9EAD29-910F-4B24-A669-EDAFBA6ED964"
local inputBoxPos = 3 -- индекс строки ввода
Event{ group="DialogEvent"; description = "FindFile auto mask";
condition=function(Event,param)
return Event==F.DE_DLGPROCINIT
and param.Msg==F.DN_CLOSE
and param.Param1>1 -- отсекаем случаи когда диалог бы отменён (Esc)
and Dlg.Id==FindFileId
end;
action=function(Event,param)
-- param.Param1 == индекс фокусного элемента диалога
-- индекс кнопки { &Find } == 23, но лучше на это не рассчитывать,
-- а проверять 'дефолность' элемента (если нет, то прекращать работу)
local i = far.SendDlgMessage (param.hDlg, F.DM_GETDLGITEM, param.Param1)
if not i or bit64.band(i[9],F.DIF_DEFAULTBUTTON)==0 then return end
local s = far.SendDlgMessage (param.hDlg, F.DM_GETTEXT, inputBoxPos)
if s:sub(1,1)=="/" then -- строка начинается со слеша --> регэксп
-- Если завершающий слеш отсутствует, то добавляем "/i"
if not s:find("/",2) then s = s.."/i" end
else --> не регэксп
--Если не указано расширение (в строке отсутствует ".")
--и нет символов масок ("*" и "?") - добавляем в конец "*"
if not s:find("[.*?/]") then s = s.."*" end
end
far.SendDlgMessage (param.hDlg, F.DM_SETTEXT, inputBoxPos, s)
end;
}
P.S.
Старые версии для FAR 1/2 тут:
Макрос возвращающий поиску прежнее поведение