Page 1 of 10

Панель для результатов поиска файлов

Posted: Wed 17 Apr, 2019 12:26
by IgorZ
Описание:
Скрипт является панельным модулем, предназначенным заменять временную панель при выводе результатов поиска файлов. Основные отличия:
  • форма вывода информации приближёна к формату результатов поиска в диалоге поиска Far;
  • функциональность скрипта, в отличие от стандартной временной панели, ограничена реальными файлами;
  • работа с файлами внутри архивов.


Требуемая версия Far 3.0.5182+.

Замечание: скрипт передаёт список содержимого плагину "Временная панель" через файл. Сборки плагина 107-109 при заполнении Временной панели содержимым из файла для каждого элемента заполняют APanel.UNCPath полным именем (включая абсолютный путь) файла-списка. Если это может сломать работу Ваших скриптов, используйте сборку Временной панели 106 от более ранней версии Far, а лучше перейдите на Far 3.0.5641+, содержащий Временную панель сборки 110+ с устранённой вышеописанной особенностью.




не обновляются атрибуты после редактирования найденных файлов

Posted: Mon 22 Apr, 2019 12:17
by IgorZ
Переделал.
  1. local F = far.Flags
  2.  
  3. local Title ="TmpPanel"
  4.  
  5. local DirSortMode
  6.  
  7. PanelModule{
  8.  
  9.   Info={
  10.  
  11.     Guid=win.Uuid("BA461384-095B-4D0F-AA87-07365A0E2AF6");
  12.  
  13.     Title=Title;
  14.  
  15.     Description="Временная панель, как окно поиска";
  16.  
  17.     Version="0.4";
  18.  
  19.     Author="IgorZ";
  20.  
  21.   };
  22.  
  23. --
  24.  
  25.   Open=function(OpenFrom)
  26.  
  27. if OpenFrom==F.OPEN_FINDLIST then
  28.  
  29.   DirSortMode = band(panel.GetPanelInfo(nil,1).Flags,F.PFLAGS_DIRECTORIESFIRST)~=0
  30.  
  31.   return {}
  32.  
  33. end
  34.  
  35.   end;
  36.  
  37. --
  38.  
  39.   SetFindList=function(object,_,Items) object.List = Items return true end;
  40.  
  41. --
  42.  
  43.   GetFindData=function (object)
  44.  
  45. local Items = {win.GetFileInfo(object.List[1].FileName:match("^(.*)\\[^\\]*$"))}
  46.  
  47. Items[1].FileName = far.ConvertPath(Items[1].FileName,F.CPM_FULL)
  48.  
  49. Items[1].CustomColumnData = {Items[1].FileName}
  50.  
  51. for _,PI in ipairs(object.List) do
  52.  
  53.   local FT = win.FileTimeToSystemTime(win.FileTimeToLocalFileTime(PI.LastWriteTime))
  54.  
  55.   Items[#Items+1] = {
  56.  
  57.     LastWriteTime = PI.LastWriteTime,
  58.  
  59.     LastAccessTime = PI.LastAccessTime,
  60.  
  61.     CreationTime = PI.CreationTime,
  62.  
  63.     ChangeTime = PI.ChangeTime,
  64.  
  65.     FileSize = PI.FileSize,
  66.  
  67.     AllocationSize = PI.AllocationSize,
  68.  
  69.     FileName = PI.FileName,
  70.  
  71.     AlternateFileName = PI.AlternateFileName,
  72.  
  73.     FileAttributes = PI.FileAttributes,
  74.  
  75.     Flags = PI.Flags,
  76.  
  77.     NumberOfLinks = PI.NumberOfLinks,
  78.  
  79.     CRC32 = PI.CRC32,
  80.  
  81.     Description = PI.Description,
  82.  
  83.     Owner = PI.Owner,
  84.  
  85.     CustomColumnData = {PI.FileAttributes:match("d") and PI.FileName or ([[%7d.%02d.%4d%3d:%02d:%02d│%13d│%-6s│%s]]):
  86.  
  87.       format(FT.wDay,FT.wMonth,FT.wYear,FT.wHour,FT.wMinute,FT.wSecond,PI.FileSize,PI.FileAttributes:upper(),PI.FileName:match("[^\\]*$"))},
  88.  
  89.     UserData = PI.UserData,
  90.  
  91.   }
  92.  
  93. end
  94.  
  95. return Items
  96.  
  97.   end;
  98.  
  99. --
  100.  
  101.   GetOpenPanelInfo=function()
  102.  
  103. return {
  104.  
  105.   Flags = F.OPIF_DISABLEFILTER+F.OPIF_DISABLESORTGROUPS+F.OPIF_ADDDOTS+F.OPIF_REALNAMES;
  106.  
  107.   PanelTitle = Title;
  108.  
  109.   PanelModesArray = {{
  110.  
  111.     ColumnTypes = "C0",
  112.  
  113.     ColumnWidths = "0",
  114.  
  115.     ColumnTitles = {"Found files:"},
  116.  
  117.     StatusColumnTypes = "N",
  118.  
  119.     StatusColumnWidths = "0",
  120.  
  121.     Flags = F.PMFLAGS_FULLSCREEN,
  122.  
  123.   }};
  124.  
  125.   PanelModesNumber = 1;
  126.  
  127.   StartPanelMode = "1";
  128.  
  129.   StartSortMode = F.SM_UNSORTED;
  130.  
  131.   StartSortOrder = 0;
  132.  
  133.   ShortcutData = "";
  134.  
  135. }
  136.  
  137.   end;
  138.  
  139. --
  140.  
  141.   ProcessPanelEvent=function(_,_,Event) if Event==F.FE_GOTFOCUS then panel.SetDirectoriesFirst(nil,1) end return false end;
  142.  
  143. --
  144.  
  145.   ClosePanel=function() panel.SetDirectoriesFirst(nil,1,DirSortMode) end;
  146.  
  147. }
Во вложении он же в архиве.
Изменения:
  • изменён внешний вид, чтобы ещё больше приблизить его к списку поиска;
  • благодаря переработке внутренней логики теперь стандартно обрабатываются любые действия Far для панели;
  • в качестве побочного эффекта в панели вместо ".." отображается пустая строка (в статусной строке по-прежнему "..").
P. S.: Стоит ли пробовать допиливать, вручную заменяя пустую строку на ".."?

не обновляются атрибуты после редактирования найденных файлов

Posted: Mon 22 Apr, 2019 20:38
by MasterLogic
Выводится только одна, первая, строка с именем папки и далее найденные файлы из всех подпапок. А ведь в окне результаты поиска (тому что хотим подражать) выводится каждая строка с путем перед найденными в этой папке файлами (даже если сами папки не ищем).
Пробовал на чистом FAR x86 3.0.5375 и 3.0.5387.

не обновляются атрибуты после редактирования найденных файлов

Posted: Tue 23 Apr, 2019 06:39
by IgorZ
MasterLogic wrote: Mon 22 Apr, 2019 20:38 Выводится только одна, первая, строка с именем папки и далее найденные файлы из всех подпапок. А ведь в окне результаты поиска (тому что хотим подражать) выводится каждая строка с путем перед найденными в этой папке файлами (даже если сами папки не ищем).
Пробовал на чистом FAR x86 3.0.5375 и 3.0.5387.
Попробовал на чистом FAR x86 3.0.5387 (скачал с сайта, распаковал, профиль нулевой, . Всё нормально (результат ниже под спойлером). Единственное - первый, корневой, каталог неверно сформировался. Это посмотрю.

не обновляются атрибуты после редактирования найденных файлов

Posted: Tue 23 Apr, 2019 07:55
by Shmuel
MasterLogic, чтобы выводились папки, надо в диалоге AltF7 установить [x] Искать папки.

не обновляются атрибуты после редактирования найденных файлов

Posted: Tue 23 Apr, 2019 08:55
by MasterLogic
IgorZ, так а запрос какой? Если *.* и стоит галка Искать папки то да, все ок. Но если в той же папке искать к примеру *.txt - строка только одна.
Shmuel, и от этой галки, в таком случае, ничего не меняется.
Но в окне поиска (что и хотим сымитировать) папки выводятся всегда, в независимости от этой галки.
Вообщем у меня выходит так:
-ищем *.*, галка не стоит - папка только первая;
-ищем *.*, галка стоит - все ок как и надо;
-ищем *.txt, галка стоит или не стоит - папка только первая.
И везде в первой строке последний каталог дважды.

не обновляются атрибуты после редактирования найденных файлов

Posted: Tue 23 Apr, 2019 09:31
by IgorZ
Оказывается, Far передаёт список найденных файлов панели довольно неожиданно (по крайней мере, для меня), хоть и логично. Если искать с текущей папки, то текущую папку он не включает в список. И это я правил сразу (хоть и некорректно, как оказалось). Если же искать в отмеченных папках, то не включаются все отмеченные (корневые, так сказать). То же относится и к поиску по путям. В общем, вроде, новая версия должна работать корректно с любыми вариантами настроек.
  1. local F = far.Flags
  2.  
  3. local Title ="TmpPanel"
  4.  
  5. local DirSortMode
  6.  
  7. PanelModule{
  8.  
  9.   Info={
  10.  
  11.     Guid=win.Uuid("BA461384-095B-4D0F-AA87-07365A0E2AF6");
  12.  
  13.     Title=Title;
  14.  
  15.     Description="Временная панель, как окно поиска";
  16.  
  17.     Version="0.5";
  18.  
  19.     Author="IgorZ";
  20.  
  21.   };
  22.  
  23. --
  24.  
  25.   Open=function(OpenFrom)
  26.  
  27. if OpenFrom==F.OPEN_FINDLIST then
  28.  
  29.   DirSortMode = band(panel.GetPanelInfo(nil,1).Flags,F.PFLAGS_DIRECTORIESFIRST)~=0
  30.  
  31.   return {}
  32.  
  33. end
  34.  
  35.   end;
  36.  
  37. --
  38.  
  39.   SetFindList=function(object,_,Items) object.List = Items return true end;
  40.  
  41. --
  42.  
  43.   GetFindData=function (object)
  44.  
  45. local Items,ldir = {},":"
  46.  
  47. for _,PI in ipairs(object.List) do
  48.  
  49.   local FT = win.FileTimeToSystemTime(win.FileTimeToLocalFileTime(PI.LastWriteTime))
  50.  
  51.   local cdir = PI.FileAttributes:match("d") and PI.FileName or PI.FileName:match("^(.*)\\[^\\]*$")
  52.  
  53.   if (not PI.FileAttributes:match("d")) and (cdir~=ldir) then
  54.  
  55.     Items[#Items+1] = win.GetFileInfo(cdir)
  56.  
  57.     Items[#Items].FileName,Items[#Items].CustomColumnData = cdir,{cdir}
  58.  
  59.   end
  60.  
  61.   ldir = cdir
  62.  
  63.   Items[#Items+1] = {
  64.  
  65.     LastWriteTime = PI.LastWriteTime,
  66.  
  67.     LastAccessTime = PI.LastAccessTime,
  68.  
  69.     CreationTime = PI.CreationTime,
  70.  
  71.     ChangeTime = PI.ChangeTime,
  72.  
  73.     FileSize = PI.FileSize,
  74.  
  75.     AllocationSize = PI.AllocationSize,
  76.  
  77.     FileName = PI.FileName,
  78.  
  79.     AlternateFileName = PI.AlternateFileName,
  80.  
  81.     FileAttributes = PI.FileAttributes,
  82.  
  83.     Flags = PI.Flags,
  84.  
  85.     NumberOfLinks = PI.NumberOfLinks,
  86.  
  87.     CRC32 = PI.CRC32,
  88.  
  89.     Description = PI.Description,
  90.  
  91.     Owner = PI.Owner,
  92.  
  93.     CustomColumnData = {PI.FileAttributes:match("d") and PI.FileName or ([[%7d.%02d.%4d%3d:%02d:%02d│%13d│%-6s│%s]]):
  94.  
  95.       format(FT.wDay,FT.wMonth,FT.wYear,FT.wHour,FT.wMinute,FT.wSecond,PI.FileSize,PI.FileAttributes:upper(),PI.FileName:match("[^\\]*$"))},
  96.  
  97.     UserData = PI.UserData,
  98.  
  99.   }
  100.  
  101. end
  102.  
  103. return Items
  104.  
  105.   end;
  106.  
  107. --
  108.  
  109.   GetOpenPanelInfo=function()
  110.  
  111. return {
  112.  
  113.   Flags = F.OPIF_DISABLEFILTER+F.OPIF_DISABLESORTGROUPS+F.OPIF_ADDDOTS+F.OPIF_REALNAMES;
  114.  
  115.   PanelTitle = Title;
  116.  
  117.   PanelModesArray = {{
  118.  
  119.     ColumnTypes = "C0",
  120.  
  121.     ColumnWidths = "0",
  122.  
  123.     ColumnTitles = {"Found files:"},
  124.  
  125.     StatusColumnTypes = "N",
  126.  
  127.     StatusColumnWidths = "0",
  128.  
  129.     Flags = F.PMFLAGS_FULLSCREEN,
  130.  
  131.   }};
  132.  
  133.   PanelModesNumber = 1;
  134.  
  135.   StartPanelMode = "1";
  136.  
  137.   StartSortMode = F.SM_UNSORTED;
  138.  
  139.   StartSortOrder = 0;
  140.  
  141.   ShortcutData = "";
  142.  
  143. }
  144.  
  145.   end;
  146.  
  147. --
  148.  
  149.   ProcessPanelEvent=function(_,_,Event) if Event==F.FE_GOTFOCUS then panel.SetDirectoriesFirst(nil,1) end return false end;
  150.  
  151. --
  152.  
  153.   ClosePanel=function() panel.SetDirectoriesFirst(nil,1,DirSortMode) end;
  154.  
  155. }
Во вложении он же в архиве.
Изменения:
  • переделана обработка каталогов.

Панель для результатов поиска

Posted: Tue 23 Apr, 2019 10:30
by MasterLogic
Да, сейчас список строится правильно. Спасибо.
Желательно еще чтобы при нажатии кнопки Панель в окне результатов не только строить этот список, но и передавать параллельно его во Временную панель (как из коробки), чтобы он не потерялся и можно было копировать и т.д.
Это не сложно доделать?

Панель для результатов поиска

Posted: Tue 23 Apr, 2019 10:37
by IgorZ
MasterLogic wrote: Tue 23 Apr, 2019 10:30 Да, сейчас список строится правильно. Спасибо.
Желательно еще чтобы при нажатии кнопки Панель в окне результатов не только строить этот список, но и передавать параллельно его во Временную панель (как из коробки), чтобы он не потерялся и можно было копировать и т.д.
Это не сложно доделать?
Не знаю. Посмотрю, но не гарантирую.

Панель для результатов поиска

Posted: Tue 23 Apr, 2019 11:18
by Shmuel
MasterLogic wrote: Tue 23 Apr, 2019 10:30 передавать параллельно его во Временную панель (как из коробки), чтобы он не потерялся и можно было копировать и т.д.
Можно создать файл-список, перейти на вторую панель и передать имя этого файла с комстроки: tmp:<имя файла>.

Панель для результатов поиска

Posted: Tue 23 Apr, 2019 12:28
by IgorZ
Shmuel wrote: Tue 23 Apr, 2019 11:18
MasterLogic wrote: Tue 23 Apr, 2019 10:30 передавать параллельно его во Временную панель (как из коробки), чтобы он не потерялся и можно было копировать и т.д.
Можно создать файл-список, перейти на вторую панель и передать имя этого файла с комстроки: tmp:<имя файла>.
Собственно, уже.
  1. local F = far.Flags
  2.  
  3. local Title ="TmpPanel"
  4.  
  5. local DirSortMode
  6.  
  7. PanelModule{
  8.  
  9.   Info={
  10.  
  11.     Guid=win.Uuid("BA461384-095B-4D0F-AA87-07365A0E2AF6");
  12.  
  13.     Title=Title;
  14.  
  15.     Description="Временная панель, как окно поиска";
  16.  
  17.     Version="0.6";
  18.  
  19.     Author="IgorZ";
  20.  
  21.   };
  22.  
  23. --
  24.  
  25.   Open=function(OpenFrom)
  26.  
  27. if OpenFrom==F.OPEN_FINDLIST then
  28.  
  29.   DirSortMode = band(panel.GetPanelInfo(nil,1).Flags,F.PFLAGS_DIRECTORIESFIRST)~=0
  30.  
  31.   return {}
  32.  
  33. end
  34.  
  35.   end;
  36.  
  37. --
  38.  
  39.   SetFindList=function(object,_,Items) object.List = Items return true end;
  40.  
  41. --
  42.  
  43.   GetFindData=function (object)
  44.  
  45. local Items,ldir = {},":"
  46.  
  47. for _,PI in ipairs(object.List) do
  48.  
  49.   local FT = win.FileTimeToSystemTime(win.FileTimeToLocalFileTime(PI.LastWriteTime))
  50.  
  51.   local cdir = PI.FileAttributes:match("d") and PI.FileName or PI.FileName:match("^(.*)\\[^\\]*$")
  52.  
  53.   if (not PI.FileAttributes:match("d")) and (cdir~=ldir) then
  54.  
  55.     Items[#Items+1] = win.GetFileInfo(cdir)
  56.  
  57.     Items[#Items].FileName,Items[#Items].CustomColumnData = cdir,{cdir}
  58.  
  59.   end
  60.  
  61.   ldir = cdir
  62.  
  63.   Items[#Items+1] = {
  64.  
  65.     LastWriteTime = PI.LastWriteTime,
  66.  
  67.     LastAccessTime = PI.LastAccessTime,
  68.  
  69.     CreationTime = PI.CreationTime,
  70.  
  71.     ChangeTime = PI.ChangeTime,
  72.  
  73.     FileSize = PI.FileSize,
  74.  
  75.     AllocationSize = PI.AllocationSize,
  76.  
  77.     FileName = PI.FileName,
  78.  
  79.     AlternateFileName = PI.AlternateFileName,
  80.  
  81.     FileAttributes = PI.FileAttributes,
  82.  
  83.     Flags = PI.Flags,
  84.  
  85.     NumberOfLinks = PI.NumberOfLinks,
  86.  
  87.     CRC32 = PI.CRC32,
  88.  
  89.     Description = PI.Description,
  90.  
  91.     Owner = PI.Owner,
  92.  
  93.     CustomColumnData = {PI.FileAttributes:match("d") and PI.FileName or ([[%7d.%02d.%4d%3d:%02d:%02d│%13d│%-6s│%s]]):
  94.  
  95.       format(FT.wDay,FT.wMonth,FT.wYear,FT.wHour,FT.wMinute,FT.wSecond,PI.FileSize,PI.FileAttributes:upper(),PI.FileName:match("[^\\]*$"))},
  96.  
  97.     UserData = PI.UserData,
  98.  
  99.   }
  100.  
  101. end
  102.  
  103. local TPGuid,fn = "B77C964B-E31E-4D4C-8FE5-D6B0C6853E7C",far.MkTemp()
  104.  
  105. local h = io.open(fn,"w")
  106.  
  107. for _,nm in ipairs(Items) do
  108.  
  109.   h:write(nm.FileName.."\n")
  110.  
  111. end
  112.  
  113. h:close()
  114.  
  115. far.MacroPost([[Keys("Tab") Plugin.Command("]]..TPGuid..[["," +replace -menu ]]..fn:gsub("\\","\\\\")..[[") Keys("Enter Tab")]])
  116.  
  117. return Items
  118.  
  119.   end;
  120.  
  121. --
  122.  
  123.   GetOpenPanelInfo=function()
  124.  
  125. return {
  126.  
  127.   Flags = F.OPIF_DISABLEFILTER+F.OPIF_DISABLESORTGROUPS+F.OPIF_ADDDOTS+F.OPIF_REALNAMES;
  128.  
  129.   PanelTitle = Title;
  130.  
  131.   PanelModesArray = {{
  132.  
  133.     ColumnTypes = "C0",
  134.  
  135.     ColumnWidths = "0",
  136.  
  137.     ColumnTitles = {"Found files:"},
  138.  
  139.     StatusColumnTypes = "N",
  140.  
  141.     StatusColumnWidths = "0",
  142.  
  143.     Flags = F.PMFLAGS_FULLSCREEN,
  144.  
  145.   }};
  146.  
  147.   PanelModesNumber = 1;
  148.  
  149.   StartPanelMode = "1";
  150.  
  151.   StartSortMode = F.SM_UNSORTED;
  152.  
  153.   StartSortOrder = 0;
  154.  
  155.   ShortcutData = "";
  156.  
  157. }
  158.  
  159.   end;
  160.  
  161. --
  162.  
  163.   ProcessPanelEvent=function(_,_,Event) if Event==F.FE_GOTFOCUS then panel.SetDirectoriesFirst(nil,1) end return false end;
  164.  
  165. --
  166.  
  167.   ClosePanel=function() panel.SetDirectoriesFirst(nil,1,DirSortMode) end;
  168.  
  169. }
Во вложении он же в архиве.
Изменения:
  • На пассивной панели открывается временная панель, куда копируется список файлов.
P. S. Похоже, так скоро дойдёт до релиза. И там уже придётся ещё и настройки влеплять. А то кому-то понравится последнее изменение, а кому-то помешает.

Панель для результатов поиска

Posted: Tue 23 Apr, 2019 14:04
by MasterLogic
IgorZ wrote: Tue 23 Apr, 2019 12:28 Собственно, уже.
В таком варианте на времен.панель попадают и папки, которые результатом поиска не являются (те что в основном открывающемся списке были для удобства). А передать данные во времен.панель никак кроме как в лоб, через внеш.файл нельзя, так как делалось фаром по дефолту?
Если нет, тогда возможно проще чтобы фар сам обрабатывал кнопку Панель, т.е. передал туда результаты поиска, а макрос вместо времен.панели выводил этот свой список.

Панель для результатов поиска

Posted: Wed 24 Apr, 2019 04:54
by IgorZ
MasterLogic wrote: Tue 23 Apr, 2019 14:04
IgorZ wrote: Tue 23 Apr, 2019 12:28 Собственно, уже.
В таком варианте на времен.панель попадают и папки, которые результатом поиска не являются (те что в основном открывающемся списке были для удобства). А передать данные во времен.панель никак кроме как в лоб, через внеш.файл нельзя, так как делалось фаром по дефолту?
Образно говоря, Вам шашечки, или ехать? Данные передаются, а как это делается - какая Вам разница?
Папки могу не передавать - это несложно сделать.
MasterLogic wrote: Tue 23 Apr, 2019 14:04 Если нет, тогда возможно проще чтобы фар сам обрабатывал кнопку Панель, т.е. передал туда результаты поиска, а макрос вместо времен.панели выводил этот свой список.
А это уже никак. Временная панель ничего не знает про сторонний скрипт, следовательно, ничего не сможет в него передать.
И ещё. Макрос - это то, что запускается по нажатию комбинации клавиш. То, что я сваял, является панельным модулем.

Панель для результатов поиска

Posted: Wed 24 Apr, 2019 06:56
by John Doe
IgorZ wrote: Wed 24 Apr, 2019 04:54Временная панель ничего не знает про сторонний скрипт, следовательно, ничего не сможет в него передать.
Разве скрипт не может сам получить с панели необходимые данные?

Панель для результатов поиска

Posted: Wed 24 Apr, 2019 07:40
by IgorZ
John Doe wrote: Wed 24 Apr, 2019 06:56
IgorZ wrote: Wed 24 Apr, 2019 04:54Временная панель ничего не знает про сторонний скрипт, следовательно, ничего не сможет в него передать.
Разве скрипт не может сам получить с панели необходимые данные?
Ну, в принципе может, это я слегка неточно выразился. Временная панель не сможет после открытия автоматически запустить скрипт. То есть, нужно запускать скрипт (причём, существенно переписанный заново) вручную. Налицо существенное ухудшение удобства пользования. Зачем?