Дополнение маски в диалоге поиска файлов

Здесь выкладываются готовые к использованию макросы и скрипты.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Дополнение маски в диалоге поиска файлов

Post by John Doe »

Макрос добавляет в диалог поиска файлов (AltF7) немного "искусственного интеллекта".

Основная его задача — вернуть поведение, присутствующее в версиях фара вплоть до 1.71 alpha 4 build 2368:
если маска, введенная пользователем, не содержит символов '?', '*' и '.', то FAR к введенному пользователем значению добавляет символ '*' и производит поиск по измененной маске.
Если введённая пользователем строка начинается со слеша /, то макрос полагает, что это регэксп, и предоставляет дополнительную функцию: при отсутствии завершающего слеша он добавляется, вместе с модификатором /i (регистронезависимый поиск).

Макрос реализован как обработчик события закрытия диалога.
  1. local F = far.Flags
  2.  
  3. local FindFileId = "8C9EAD29-910F-4B24-A669-EDAFBA6ED964"
  4.  
  5. local inputBoxPos = 3 -- индекс строки ввода
  6.  
  7.  
  8.  
  9. Event{ group="DialogEvent"; description = "FindFile auto mask";
  10.  
  11.  
  12.  
  13. condition=function(Event,param)
  14.  
  15.   return Event==F.DE_DLGPROCINIT
  16.  
  17.            and param.Msg==F.DN_CLOSE
  18.  
  19.            and param.Param1>1        -- отсекаем случаи когда диалог бы отменён (Esc)
  20.  
  21.            and Dlg.Id==FindFileId
  22.  
  23. end;
  24.  
  25.  
  26.  
  27. action=function(Event,param)
  28.  
  29.   -- param.Param1 == индекс фокусного элемента диалога
  30.  
  31.   -- индекс кнопки { &Find } == 23, но лучше на это не рассчитывать,
  32.  
  33.   -- а проверять 'дефолность' элемента (если нет, то прекращать работу)
  34.  
  35.   local i = far.SendDlgMessage (param.hDlg, F.DM_GETDLGITEM, param.Param1)
  36.  
  37.   if not i or bit64.band(i[9],F.DIF_DEFAULTBUTTON)==0 then return end
  38.  
  39.  
  40.  
  41.   local s = far.SendDlgMessage (param.hDlg, F.DM_GETTEXT, inputBoxPos)
  42.  
  43.   if s:sub(1,1)=="/" then -- строка начинается со слеша --> регэксп
  44.  
  45.     -- Если завершающий слеш отсутствует, то добавляем "/i"
  46.  
  47.     if not s:find("/",2) then s = s.."/i" end
  48.  
  49.   else --> не регэксп
  50.  
  51.     --Если не указано расширение (в строке отсутствует ".")
  52.  
  53.     --и нет символов масок ("*" и "?") - добавляем в конец "*"
  54.  
  55.     if not s:find("[.*?/]") then s = s.."*" end
  56.  
  57.   end
  58.  
  59.   far.SendDlgMessage (param.hDlg, F.DM_SETTEXT, inputBoxPos, s)
  60.  
  61. end;
  62.  
  63. }
P.S.
Старые версии для FAR 1/2 тут: Макрос возвращающий поиску прежнее поведение
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Дополнение маски в диалоге поиска файлов

Post by Smitis »

John Doe wrote:Старые версии для FAR 1/2 тут:
Если быть точным, то там и версии для FAR 3.
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Дополнение маски в диалоге поиска файлов

Post by John Doe »

Лично я не уверен в их работоспособности: с тех пор ломалось API LuaFAR.
Post Reply

Return to “Полезные макросы и скрипты”