Page 1 of 5

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

Posted: Wed 17 Apr, 2019 12:26
by IgorZ
IgorZ wrote:
Wed 17 Apr, 2019 12:26
Описание:
Скрипт является панельным модулем, предназначенным заменять временную панель при выводе результатов поиска файлов. Основные отличия
  • форма вывода информации приближёна к формату результатов поиска в диалоге поиска 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
Временная панель ничего не знает про сторонний скрипт, следовательно, ничего не сможет в него передать.
Разве скрипт не может сам получить с панели необходимые данные?
Ну, в принципе может, это я слегка неточно выразился. Временная панель не сможет после открытия автоматически запустить скрипт. То есть, нужно запускать скрипт (причём, существенно переписанный заново) вручную. Налицо существенное ухудшение удобства пользования. Зачем?