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

Здесь обсуждается всё, что касается макросов.
IgorZ
Posts: 609
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 43 times

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

Post by IgorZ » Wed 17 Apr, 2019 12:26

Описание:
Скрипт является панельным модулем, предназначенным заменять временную панель при выводе результатов поиска файлов. Основное отличие - форма вывода информации, максимально приближённая к формату результатов поиска в диалоге поиска Far.



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



Attachments
TmpPanel.1.0.1.7z
(7.36 KiB) Downloaded 31 times
Last edited by IgorZ on Tue 30 Apr, 2019 07:29, edited 3 times in total.

IgorZ
Posts: 609
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 43 times

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

Post by IgorZ » Mon 22 Apr, 2019 12:17

Переделал.
  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.: Стоит ли пробовать допиливать, вручную заменяя пустую строку на ".."?
Attachments
TmpPanel.lua.0.4.7z
(1.22 KiB) Downloaded 26 times
Last edited by IgorZ on Mon 22 Apr, 2019 12:27, edited 1 time in total.

MasterLogic
Posts: 8
Joined: Wed 15 Aug, 2018 12:17
Has thanked: 1 time

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

Post by MasterLogic » Mon 22 Apr, 2019 20:38

Выводится только одна, первая, строка с именем папки и далее найденные файлы из всех подпапок. А ведь в окне результаты поиска (тому что хотим подражать) выводится каждая строка с путем перед найденными в этой папке файлами (даже если сами папки не ищем).
Пробовал на чистом FAR x86 3.0.5375 и 3.0.5387.

IgorZ
Posts: 609
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 43 times

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

Post by IgorZ » Tue 23 Apr, 2019 06:39

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

Shmuel
Posts: 5900
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 223 times

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

Post by Shmuel » Tue 23 Apr, 2019 07:55

MasterLogic, чтобы выводились папки, надо в диалоге AltF7 установить [x] Искать папки.

MasterLogic
Posts: 8
Joined: Wed 15 Aug, 2018 12:17
Has thanked: 1 time

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

Post by MasterLogic » Tue 23 Apr, 2019 08:55

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

IgorZ
Posts: 609
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 43 times

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

Post by IgorZ » Tue 23 Apr, 2019 09:31

Оказывается, 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. }
Во вложении он же в архиве.
Изменения:
  • переделана обработка каталогов.
Attachments
TmpPanel.0.5.7z
(1.26 KiB) Downloaded 18 times
Last edited by IgorZ on Tue 23 Apr, 2019 09:32, edited 1 time in total.

MasterLogic
Posts: 8
Joined: Wed 15 Aug, 2018 12:17
Has thanked: 1 time

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

Post by MasterLogic » Tue 23 Apr, 2019 10:30

Да, сейчас список строится правильно. Спасибо.
Желательно еще чтобы при нажатии кнопки Панель в окне результатов не только строить этот список, но и передавать параллельно его во Временную панель (как из коробки), чтобы он не потерялся и можно было копировать и т.д.
Это не сложно доделать?

IgorZ
Posts: 609
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 43 times

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

Post by IgorZ » Tue 23 Apr, 2019 10:37

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

Shmuel
Posts: 5900
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 223 times

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

Post by Shmuel » Tue 23 Apr, 2019 11:18

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

IgorZ
Posts: 609
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 43 times

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

Post by IgorZ » Tue 23 Apr, 2019 12:28

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. Похоже, так скоро дойдёт до релиза. И там уже придётся ещё и настройки влеплять. А то кому-то понравится последнее изменение, а кому-то помешает.
Attachments
TmpPanel.0.6.7z
(1.44 KiB) Downloaded 25 times
Last edited by IgorZ on Tue 23 Apr, 2019 12:30, edited 1 time in total.

MasterLogic
Posts: 8
Joined: Wed 15 Aug, 2018 12:17
Has thanked: 1 time

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

Post by MasterLogic » Tue 23 Apr, 2019 14:04

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

IgorZ
Posts: 609
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 43 times

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

Post by IgorZ » Wed 24 Apr, 2019 04:54

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

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

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

Post by John Doe » Wed 24 Apr, 2019 06:56

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

IgorZ
Posts: 609
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 43 times

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

Post by IgorZ » Wed 24 Apr, 2019 07:40

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

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

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

Post by John Doe » Wed 24 Apr, 2019 08:24

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

Post Reply

Return to “Обсуждение макросов”