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

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

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

Postby John Doe » Mon 23 Dec, 2013 15:14

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

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

Если введённая пользователем строка начинается со слеша /, то макрос полагает, что это регэксп, и предоставляет дополнительную функцию: при отсутствии завершающего слеша он добавляется, вместе с модификатором /i (регистронезависимый поиск).

Макрос реализован как обработчик события закрытия диалога.
  1. local F = far.Flags
  2. local FindFileId = "8C9EAD29-910F-4B24-A669-EDAFBA6ED964"
  3. local inputBoxPos = 3 -- индекс строки ввода
  4.  
  5. Event{ group="DialogEvent"; description = "FindFile auto mask";
  6.  
  7. condition=function(Event,param)
  8.   return Event==F.DE_DLGPROCINIT
  9.            and param.Msg==F.DN_CLOSE
  10.            and param.Param1>1        -- отсекаем случаи когда диалог бы отменён (Esc)
  11.            and Dlg.Id==FindFileId
  12. end;
  13.  
  14. action=function(Event,param)
  15.   -- param.Param1 == индекс фокусного элемента диалога
  16.   -- индекс кнопки { &Find } == 23, но лучше на это не рассчитывать,
  17.   -- а проверять 'дефолность' элемента (если нет, то прекращать работу)
  18.   local i = far.SendDlgMessage (param.hDlg, F.DM_GETDLGITEM, param.Param1)
  19.   if not i or bit64.band(i[9],F.DIF_DEFAULTBUTTON)==0 then return end
  20.  
  21.   local s = far.SendDlgMessage (param.hDlg, F.DM_GETTEXT, inputBoxPos)
  22.   if s:sub(1,1)=="/" then -- строка начинается со слеша --> регэксп
  23.     -- Если завершающий слеш отсутствует, то добавляем "/i"
  24.     if not s:find("/",2) then s = s.."/i" end
  25.   else --> не регэксп
  26.     --Если не указано расширение (в строке отсутствует ".")
  27.     --и нет символов масок ("*" и "?") - добавляем в конец "*"
  28.     if not s:find("[.*?/]") then s = s.."*" end
  29.   end
  30.   far.SendDlgMessage (param.hDlg, F.DM_SETTEXT, inputBoxPos, s)
  31. end;
  32. }


P.S.
Старые версии для FAR 1/2 тут: Макрос возвращающий поиску прежнее поведение

Smitis
Posts: 1430
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 9 times
Been thanked: 21 times
Contact:

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

Postby Smitis » Tue 18 Feb, 2014 19:56

John Doe wrote:Старые версии для FAR 1/2 тут:

Если быть точным, то там и версии для FAR 3.
Разум когда-нибудь победит.

User avatar
John Doe
Бюрократ
Posts: 11038
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

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

Postby John Doe » Tue 18 Feb, 2014 20:02

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


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

Who is online

Users browsing this forum: No registered users and 1 guest