Page 1 of 2

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

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



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




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

Posted: Mon 22 Apr, 2019 12:17
by IgorZ
Переделал.
  1. local F = far.Flags
  2. local Title ="TmpPanel"
  3. local DirSortMode
  4. PanelModule{
  5.   Info={
  6.     Guid=win.Uuid("BA461384-095B-4D0F-AA87-07365A0E2AF6");
  7.     Title=Title;
  8.     Description="Временная панель, как окно поиска";
  9.     Version="0.4";
  10.     Author="IgorZ";
  11.   };
  12. --
  13.   Open=function(OpenFrom)
  14. if OpenFrom==F.OPEN_FINDLIST then
  15.   DirSortMode = band(panel.GetPanelInfo(nil,1).Flags,F.PFLAGS_DIRECTORIESFIRST)~=0
  16.   return {}
  17. end
  18.   end;
  19. --
  20.   SetFindList=function(object,_,Items) object.List = Items return true end;
  21. --
  22.   GetFindData=function (object)
  23. local Items = {win.GetFileInfo(object.List[1].FileName:match("^(.*)\\[^\\]*$"))}
  24. Items[1].FileName = far.ConvertPath(Items[1].FileName,F.CPM_FULL)
  25. Items[1].CustomColumnData = {Items[1].FileName}
  26. for _,PI in ipairs(object.List) do
  27.   local FT = win.FileTimeToSystemTime(win.FileTimeToLocalFileTime(PI.LastWriteTime))
  28.   Items[#Items+1] = {
  29.     LastWriteTime = PI.LastWriteTime,
  30.     LastAccessTime = PI.LastAccessTime,
  31.     CreationTime = PI.CreationTime,
  32.     ChangeTime = PI.ChangeTime,
  33.     FileSize = PI.FileSize,
  34.     AllocationSize = PI.AllocationSize,
  35.     FileName = PI.FileName,
  36.     AlternateFileName = PI.AlternateFileName,
  37.     FileAttributes = PI.FileAttributes,
  38.     Flags = PI.Flags,
  39.     NumberOfLinks = PI.NumberOfLinks,
  40.     CRC32 = PI.CRC32,
  41.     Description = PI.Description,
  42.     Owner = PI.Owner,
  43.     CustomColumnData = {PI.FileAttributes:match("d") and PI.FileName or ([[%7d.%02d.%4d%3d:%02d:%02d│%13d│%-6s│%s]]):
  44.       format(FT.wDay,FT.wMonth,FT.wYear,FT.wHour,FT.wMinute,FT.wSecond,PI.FileSize,PI.FileAttributes:upper(),PI.FileName:match("[^\\]*$"))},
  45.     UserData = PI.UserData,
  46.   }
  47. end
  48. return Items
  49.   end;
  50. --
  51.   GetOpenPanelInfo=function()
  52. return {
  53.   Flags = F.OPIF_DISABLEFILTER+F.OPIF_DISABLESORTGROUPS+F.OPIF_ADDDOTS+F.OPIF_REALNAMES;
  54.   PanelTitle = Title;
  55.   PanelModesArray = {{
  56.     ColumnTypes = "C0",
  57.     ColumnWidths = "0",
  58.     ColumnTitles = {"Found files:"},
  59.     StatusColumnTypes = "N",
  60.     StatusColumnWidths = "0",
  61.     Flags = F.PMFLAGS_FULLSCREEN,
  62.   }};
  63.   PanelModesNumber = 1;
  64.   StartPanelMode = "1";
  65.   StartSortMode = F.SM_UNSORTED;
  66.   StartSortOrder = 0;
  67.   ShortcutData = "";
  68. }
  69.   end;
  70. --
  71.   ProcessPanelEvent=function(_,_,Event) if Event==F.FE_GOTFOCUS then panel.SetDirectoriesFirst(nil,1) end return false end;
  72. --
  73.   ClosePanel=function() panel.SetDirectoriesFirst(nil,1,DirSortMode) end;
  74. }
Во вложении он же в архиве.
Изменения:
  • изменён внешний вид, чтобы ещё больше приблизить его к списку поиска;
  • благодаря переработке внутренней логики теперь стандартно обрабатываются любые действия 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. local Title ="TmpPanel"
  3. local DirSortMode
  4. PanelModule{
  5.   Info={
  6.     Guid=win.Uuid("BA461384-095B-4D0F-AA87-07365A0E2AF6");
  7.     Title=Title;
  8.     Description="Временная панель, как окно поиска";
  9.     Version="0.5";
  10.     Author="IgorZ";
  11.   };
  12. --
  13.   Open=function(OpenFrom)
  14. if OpenFrom==F.OPEN_FINDLIST then
  15.   DirSortMode = band(panel.GetPanelInfo(nil,1).Flags,F.PFLAGS_DIRECTORIESFIRST)~=0
  16.   return {}
  17. end
  18.   end;
  19. --
  20.   SetFindList=function(object,_,Items) object.List = Items return true end;
  21. --
  22.   GetFindData=function (object)
  23. local Items,ldir = {},":"
  24. for _,PI in ipairs(object.List) do
  25.   local FT = win.FileTimeToSystemTime(win.FileTimeToLocalFileTime(PI.LastWriteTime))
  26.   local cdir = PI.FileAttributes:match("d") and PI.FileName or PI.FileName:match("^(.*)\\[^\\]*$")
  27.   if (not PI.FileAttributes:match("d")) and (cdir~=ldir) then
  28.     Items[#Items+1] = win.GetFileInfo(cdir)
  29.     Items[#Items].FileName,Items[#Items].CustomColumnData = cdir,{cdir}
  30.   end
  31.   ldir = cdir
  32.   Items[#Items+1] = {
  33.     LastWriteTime = PI.LastWriteTime,
  34.     LastAccessTime = PI.LastAccessTime,
  35.     CreationTime = PI.CreationTime,
  36.     ChangeTime = PI.ChangeTime,
  37.     FileSize = PI.FileSize,
  38.     AllocationSize = PI.AllocationSize,
  39.     FileName = PI.FileName,
  40.     AlternateFileName = PI.AlternateFileName,
  41.     FileAttributes = PI.FileAttributes,
  42.     Flags = PI.Flags,
  43.     NumberOfLinks = PI.NumberOfLinks,
  44.     CRC32 = PI.CRC32,
  45.     Description = PI.Description,
  46.     Owner = PI.Owner,
  47.     CustomColumnData = {PI.FileAttributes:match("d") and PI.FileName or ([[%7d.%02d.%4d%3d:%02d:%02d│%13d│%-6s│%s]]):
  48.       format(FT.wDay,FT.wMonth,FT.wYear,FT.wHour,FT.wMinute,FT.wSecond,PI.FileSize,PI.FileAttributes:upper(),PI.FileName:match("[^\\]*$"))},
  49.     UserData = PI.UserData,
  50.   }
  51. end
  52. return Items
  53.   end;
  54. --
  55.   GetOpenPanelInfo=function()
  56. return {
  57.   Flags = F.OPIF_DISABLEFILTER+F.OPIF_DISABLESORTGROUPS+F.OPIF_ADDDOTS+F.OPIF_REALNAMES;
  58.   PanelTitle = Title;
  59.   PanelModesArray = {{
  60.     ColumnTypes = "C0",
  61.     ColumnWidths = "0",
  62.     ColumnTitles = {"Found files:"},
  63.     StatusColumnTypes = "N",
  64.     StatusColumnWidths = "0",
  65.     Flags = F.PMFLAGS_FULLSCREEN,
  66.   }};
  67.   PanelModesNumber = 1;
  68.   StartPanelMode = "1";
  69.   StartSortMode = F.SM_UNSORTED;
  70.   StartSortOrder = 0;
  71.   ShortcutData = "";
  72. }
  73.   end;
  74. --
  75.   ProcessPanelEvent=function(_,_,Event) if Event==F.FE_GOTFOCUS then panel.SetDirectoriesFirst(nil,1) end return false end;
  76. --
  77.   ClosePanel=function() panel.SetDirectoriesFirst(nil,1,DirSortMode) end;
  78. }
Во вложении он же в архиве.
Изменения:
  • переделана обработка каталогов.

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

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. local Title ="TmpPanel"
  3. local DirSortMode
  4. PanelModule{
  5.   Info={
  6.     Guid=win.Uuid("BA461384-095B-4D0F-AA87-07365A0E2AF6");
  7.     Title=Title;
  8.     Description="Временная панель, как окно поиска";
  9.     Version="0.6";
  10.     Author="IgorZ";
  11.   };
  12. --
  13.   Open=function(OpenFrom)
  14. if OpenFrom==F.OPEN_FINDLIST then
  15.   DirSortMode = band(panel.GetPanelInfo(nil,1).Flags,F.PFLAGS_DIRECTORIESFIRST)~=0
  16.   return {}
  17. end
  18.   end;
  19. --
  20.   SetFindList=function(object,_,Items) object.List = Items return true end;
  21. --
  22.   GetFindData=function (object)
  23. local Items,ldir = {},":"
  24. for _,PI in ipairs(object.List) do
  25.   local FT = win.FileTimeToSystemTime(win.FileTimeToLocalFileTime(PI.LastWriteTime))
  26.   local cdir = PI.FileAttributes:match("d") and PI.FileName or PI.FileName:match("^(.*)\\[^\\]*$")
  27.   if (not PI.FileAttributes:match("d")) and (cdir~=ldir) then
  28.     Items[#Items+1] = win.GetFileInfo(cdir)
  29.     Items[#Items].FileName,Items[#Items].CustomColumnData = cdir,{cdir}
  30.   end
  31.   ldir = cdir
  32.   Items[#Items+1] = {
  33.     LastWriteTime = PI.LastWriteTime,
  34.     LastAccessTime = PI.LastAccessTime,
  35.     CreationTime = PI.CreationTime,
  36.     ChangeTime = PI.ChangeTime,
  37.     FileSize = PI.FileSize,
  38.     AllocationSize = PI.AllocationSize,
  39.     FileName = PI.FileName,
  40.     AlternateFileName = PI.AlternateFileName,
  41.     FileAttributes = PI.FileAttributes,
  42.     Flags = PI.Flags,
  43.     NumberOfLinks = PI.NumberOfLinks,
  44.     CRC32 = PI.CRC32,
  45.     Description = PI.Description,
  46.     Owner = PI.Owner,
  47.     CustomColumnData = {PI.FileAttributes:match("d") and PI.FileName or ([[%7d.%02d.%4d%3d:%02d:%02d│%13d│%-6s│%s]]):
  48.       format(FT.wDay,FT.wMonth,FT.wYear,FT.wHour,FT.wMinute,FT.wSecond,PI.FileSize,PI.FileAttributes:upper(),PI.FileName:match("[^\\]*$"))},
  49.     UserData = PI.UserData,
  50.   }
  51. end
  52. local TPGuid,fn = "B77C964B-E31E-4D4C-8FE5-D6B0C6853E7C",far.MkTemp()
  53. local h = io.open(fn,"w")
  54. for _,nm in ipairs(Items) do
  55.   h:write(nm.FileName.."\n")
  56. end
  57. h:close()
  58. far.MacroPost([[Keys("Tab") Plugin.Command("]]..TPGuid..[["," +replace -menu ]]..fn:gsub("\\","\\\\")..[[") Keys("Enter Tab")]])
  59. return Items
  60.   end;
  61. --
  62.   GetOpenPanelInfo=function()
  63. return {
  64.   Flags = F.OPIF_DISABLEFILTER+F.OPIF_DISABLESORTGROUPS+F.OPIF_ADDDOTS+F.OPIF_REALNAMES;
  65.   PanelTitle = Title;
  66.   PanelModesArray = {{
  67.     ColumnTypes = "C0",
  68.     ColumnWidths = "0",
  69.     ColumnTitles = {"Found files:"},
  70.     StatusColumnTypes = "N",
  71.     StatusColumnWidths = "0",
  72.     Flags = F.PMFLAGS_FULLSCREEN,
  73.   }};
  74.   PanelModesNumber = 1;
  75.   StartPanelMode = "1";
  76.   StartSortMode = F.SM_UNSORTED;
  77.   StartSortOrder = 0;
  78.   ShortcutData = "";
  79. }
  80.   end;
  81. --
  82.   ProcessPanelEvent=function(_,_,Event) if Event==F.FE_GOTFOCUS then panel.SetDirectoriesFirst(nil,1) end return false end;
  83. --
  84.   ClosePanel=function() panel.SetDirectoriesFirst(nil,1,DirSortMode) end;
  85. }
Во вложении он же в архиве.
Изменения:
  • На пассивной панели открывается временная панель, куда копируется список файлов.
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
Временная панель ничего не знает про сторонний скрипт, следовательно, ничего не сможет в него передать.
Разве скрипт не может сам получить с панели необходимые данные?
Ну, в принципе может, это я слегка неточно выразился. Временная панель не сможет после открытия автоматически запустить скрипт. То есть, нужно запускать скрипт (причём, существенно переписанный заново) вручную. Налицо существенное ухудшение удобства пользования. Зачем?

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

Posted: Wed 24 Apr, 2019 08:24
by John Doe
Универсальность повысится. Такой режим отображения будет полезен не только для результатов поиска.
IgorZ wrote:
Wed 24 Apr, 2019 07:40
причём, существенно переписанный заново
Возможно будет проще интегрировать во временную панель из плагинов Shmuel.