Пометить на панелях файлы с одинаковым содержимым независимо от имён

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
citRiks
Posts: 1307
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 387 times
Been thanked: 80 times

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by citRiks »

Latest post of the previous page:

Впрочем, решаемо:

Code: Select all

local function CreateList(_Panel, WhatPanel, whatpanel)
	local Result = {}
	local res_status
	local Path = _Panel.Path..(_Panel.Path:sub(-1) == '\\' and '' or '\\')
	local i1 = 1
	local i2 = _Panel.Selected and _Panel.SelCount or _Panel.ItemCount
	local GetFun = _Panel.Selected and panel.GetSelectedPanelItem or panel.GetPanelItem
	for i = i1, i2 do
		local Item = GetFun(nil, whatpanel, i)
		if not Item.FileAttributes:match("d")
		then
			local	FullName = Path..Item.FileName
			local	plgin_call_res = Plugin.SyncCall("E186306E-3B0D-48C1-9668-ED7CF64C0E65", "gethash", 'SHA-512', FullName, true)
			if	plgin_call_res == "userabort"
			then	res_status = plgin_call_res
				break
			end
			local sKey = ('%.10d;%s'):format(
				Item.FileSize,
			--	Item.FileSize == 0 and (' '):rep(128) or
				plgin_call_res
					)
			if Result[sKey] == nil then Result[sKey] = { } end
			tin(Result[sKey], Item.FileName)
		end
	end
	return Result, res_status
end -- CreateList
.. и:

Code: Select all

	local AList, act_status
	local PList, pas_status
	AList, act_status = CreateList(APanel, 0, 1)
	if act_status == "userabort" then goto after_create_list end
	PList, pas_status = CreateList(PPanel, 1, 0)
	if pas_status == "userabort" then goto after_create_list end
	::after_create_list::
--	local ASelList, PSelList, KeyList = { }, { }, { }
	local ASelList, PSelList = { }, { }
Да, я знаю что GOTO это плохо, только не знаю почему :)
Думаю что так же как и со всем остальным,
в одних ситуациях это хорошо, а в других - плохо
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2561
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 332 times
Contact:

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by buniak_a_h »

citRiks wrote: Fri 15 Jan, 2021 21:06 buniak_a_h,
а есть идеи как отменить calculations не выходя из ФАРа ?
А то он пока не досчитает не успокоится..
Да, как-то неаккуратно.
После строки
for i=i1,i2 do
надо вставить:

Code: Select all

   if mf.waitkey(1,0) == 'Esc' and 
      far.Message('Вы действительно хотите прервать процесс сравнения файлов?', 'Сравнение панелей по содержимому', ';YesNo', 'w') == 1 then
    break
   end
То, что Вы написали я, извините, не анализировал - очень много буковок
buniak_a_h
Posts: 2561
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 332 times
Contact:

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by buniak_a_h »

Получилось так:
  1. --[[
  2. Вариант группирования файлов по длине и CRC, обхода файлов одной панели и поиска на другой
  3. "парных" (совпадающих по длине и CRC).
  4. --]]
  5. --local F = far.Flags
  6. --local DialogTools = require"BAX.DialogTools"
  7. --local GetMsgEx = require"BAX.GetMsg"
  8. local tin = table.insert
  9. -- Сравнение панелей по содержимому.
  10. -- Выделяются файлы, копия которых (безотносительно к имени) имеется на другой панели
  11. ----[[*D*]]local le = require"le"
  12. -------------------------------------------------------------------------------------
  13. --local function CmpDial()
  14. -- local DlgItems = {}
  15. -- local function Add(DItem) tin(DlgItems, DialogTools.DialogItem(DItem)) end
  16. -- local h,w=13,70
  17. -- Add{'DI_DOUBLEBOX',x1=0,y1=0,x2=w,y2=h,text='Сравнение панелей'}
  18. -- Add{'DI_CHECKBOX', x1=3,y1=2,Text='При сравнении учитывать дату'; Checked=0}
  19. -- Add{'DI_CHECKBOX', x1=3,y1=3,Text='Выделить одинаковые файлы на панелях'; Checked=1}
  20. -- Add{'DI_TEXT', x1=1,x2=w-2,y1=5; Text='Выполнить сценарий для совпавших файлов:'; Flags='DIF_CENTERTEXT'}
  21. -- Add{'DI_TEXT', x1=3;y1=6;Text='Для файлов с активной  панели (%1 - имя файла)'}
  22. -- Add{'DI_EDIT', x1=3,x2=w-4,y1=7}
  23. -- Add{'DI_TEXT', x1=3;y1=8;Text='Для файлов с пассивной панели (%1 - имя файла)'}
  24. -- Add{'DI_EDIT', x1=3,x2=w-4,y1=9}
  25. -- Add{'DI_TEXT', x1=-1, y1=10, Flags='DIF_SEPARATOR'}
  26. -- Add{'DI_BUTTON', y1=11, Flags='DIF_CENTERGROUP|DIF_DEFAULTBUTTON', Text='Ok'}
  27. -- Add{'DI_BUTTON', y1=11, Flags='DIF_CENTERGROUP', Text='Cancel'}
  28. -- far.Dialog('44C0A2E9-5F23-4E5C-9BE9-D94F3849D63B', -1,-1,w,h,nil,DlgItems, F.FDLG_SMALLDIALOG)
  29. --end -- CmpDial
  30. -------------------------------------------------------------------------------------
  31. local function CmpFunc()
  32.  local function CreateList(_Panel, WhatPanel, whatpanel)
  33.   local Result ={}
  34.   local Path = _Panel.Path .. (_Panel.Path:sub(-1)=='\\' and '' or '\\')
  35.   local i1,i2,GetFun=1,_Panel.Selected and _Panel.SelCount or _Panel.ItemCount, _Panel.Selected and panel.GetSelectedPanelItem or panel.GetPanelItem
  36.   for i=i1,i2 do
  37.    if mf.waitkey(1,0) == 'Esc' and
  38.       far.Message('Вы действительно хотите прервать процесс сравнения файлов?', 'Сравнение панелей по содержимому', ';YesNo', 'w') == 1 then
  39.     break
  40.    end
  41.    local Item = GetFun(nil, whatpanel, i)
  42.    if not Item.FileAttributes:match"d" then
  43.     local FullName = Path .. Item.FileName
  44.     local sKey = ('%.10d;%s'):format(Item.FileSize, Item.FileSize == 0 and (' '):rep(128) or Plugin.SyncCall("E186306E-3B0D-48C1-9668-ED7CF64C0E65", "gethash", 'SHA-512', FullName, true))
  45.     if Result[sKey] == nil then Result[sKey] = {} end
  46.     tin(Result[sKey], Item.FileName)
  47.    end
  48.   end
  49.   return Result
  50.  end -- CreateList
  51.  --local tStart = Far.UpTime
  52.  local AList, PList = CreateList(APanel, 0,1), CreateList(PPanel,1,0)
  53.  --local ASelList, PSelList, KeyList = {}, {}, {}
  54.  local ASelList, PSelList = {}, {}
  55.  local i,v = next(AList)
  56.  while i do
  57.   if PList[i] then
  58.    --KeyList[i] = {v, PList[i]}
  59.    for _,w in ipairs(v) do tin(ASelList, w) end
  60.    for _,w in ipairs(PList[i]) do tin(PSelList, w) end
  61.   end
  62.   i,v = next(AList, i)
  63.  end
  64.  if #ASelList > 0 then
  65.   Panel.Select(0, 0)
  66.   Panel.Select(1, 0)
  67.   Panel.Select(0, 1, 2, table.concat(ASelList, '\n'))
  68.   Panel.Select(1, 1, 2, table.concat(PSelList, '\n'))
  69.   --CmpDial()
  70.  end
  71.  ----[[*D*]]le({Time=Far.UpTime-tStart, AList=AList, PList=PList, ASelList=ASelList, PSelList=PSelList})
  72. end -- CmpFunc
  73. -------------------------------------------------------------------------
  74. MenuItem {
  75.   description = "Сравнение панелей по содержимому";
  76.   menu   = "Plugins";
  77.   area   = "Shell";
  78.   guid   = "C95988A8-E802-4541-A2F3-323D8FA89A12";
  79.   text   = function(menu,area)
  80.    return "Сравнение панелей по содержимому"
  81.   end;
  82.   action = function(OpenFrom,Item)
  83.    CmpFunc()
  84.   end;
  85. }
  86. -------------------------------------------------------------------------
  87. NoMacro{ -- Для активации уберите 'No' в начале строки
  88.   id="748A9A2C-1D4B-4A85-9B27-B881F98BAC90";
  89.   area="Shell";
  90.   key=""; -- Сюда свой хоткей вставить
  91.   description = "Сравнение панелей по содержимому";
  92.   flags="";
  93.   condition=function(key, data) return APanel.Visible and PPanel.Visible end;
  94.   action=function(data)
  95.    CmpFunc()
  96.   end;
  97. }
  98.  
По-прежнему настройка хоткея и включение макроса - на совести юзера.
ContentCompare.lua.7z
Для удобства скачивания. То же самое, что в тексте.
(1.96 KiB) Downloaded 16 times
citRiks
Posts: 1307
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 387 times
Been thanked: 80 times

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by citRiks »

buniak_a_h,
Еще мне показалось что неаккуратно это когда вычисляем бессмысленно файлы,
у которых нет такого же размера файла на противоположной панели
Положил фикс сюда:
https://github.com/dr-dba/far-lua-panel-duplicates
(со ссылкой на оригинал конечно)
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 1307
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 387 times
Been thanked: 80 times

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by citRiks »

buniak_a_h wrote: Fri 15 Jan, 2021 22:02 Получилось так:
Подход с использованием waitkey весьма интересный,
но замедляет на больших директориях вычисления раз в *дцать.
Без WaitKey: 700 мс
С WaitKey: 11 сек (11,500+ мс)
а мною предложенное не замедляет :)
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2561
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 332 times
Contact:

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by buniak_a_h »

citRiks wrote: Fri 15 Jan, 2021 22:46
buniak_a_h wrote: Fri 15 Jan, 2021 22:02 Получилось так:
Подход с использованием waitkey весьма интересный,
но замедляет на больших директориях вычисления раз в *дцать.
Без WaitKey: 700 мс
С WaitKey: 11 сек (11,500+ мс)
а мною предложенное не замедляет :)
1. Если я правильно понял, Вы анализируете код выхода из плагина. Это - правильно, но если много очень маленьких файлов, трудно снять именно плагин (нажать Esc во время вычисления КС). Или плагин будет прерван даже если нажать во время выполнения макроса?
2. Про коды возврата не видел…
waitkey(1,… ) - одна миллисекунда. Не ожидал, что это может замедлить.
citRiks wrote: Fri 15 Jan, 2021 21:23 Впрочем, решаемо: …
Это на каком языке? Вроде, в lua нет ни goto, ни меток вида ::label::. Или я чего-то не знаю?
citRiks
Posts: 1307
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 387 times
Been thanked: 80 times

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by citRiks »

buniak_a_h wrote: Fri 15 Jan, 2021 23:51 Если я правильно понял, Вы анализируете код выхода из плагина.
это да
buniak_a_h wrote: Fri 15 Jan, 2021 23:51 Это - правильно, но если много очень маленьких файлов, трудно снять именно плагин (нажать Esc во время вычисления КС)
может быть, но с маленькими файлами все и так пролетает очень быстро,
а проблемы есть с большими файлами, когда надо отменить,
потому что получается медленно/напрасно/передумали
buniak_a_h wrote: Fri 15 Jan, 2021 23:51 Или плагин будет прерван даже если нажать во время выполнения макроса?
хммм..
сложно проверить потому что у меня пока на том количестве мелких файлах (~ тысячи) пролетает быстро :)
но я конечно обращу внимание когда найду такую папку

Может быть, надо сделать комбинированниую отмену,
вместе с WaitKey мапример на каждом 20-м файле,
и вместе с проверкой на userabort в плагине,
ведь одно другому никак не мешает
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 1307
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 387 times
Been thanked: 80 times

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by citRiks »

buniak_a_h wrote: Fri 15 Jan, 2021 23:51 waitkey(1,… ) - одна миллисекунда. Не ожидал, что это может замедлить.
может потому что все что пытается ловить реакции пользователя вынуждено синхронизироваться с основным потоком?
а когда без реакции пользователя, то шпарит себе не отвлекаясь ни на что ..
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2561
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 332 times
Contact:

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by buniak_a_h »

citRiks wrote: Sat 16 Jan, 2021 09:23 сложно проверить
А вставить в цикл win.Sleep ?
citRiks
Posts: 1307
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 387 times
Been thanked: 80 times

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by citRiks »

buniak_a_h, пока слету не уловил что и как это должно доказать ..?
И пока у меня и ни у кого (?) нет ощутимых проблем с юзабельностью, наверное не буду углубляться

PS
На всякий случай напомню, что самое главное это считать ТОЛьКО файлы которые имеют одинаковый размер с чем-либо на противоположной панели, вы это у себя пофиксили?
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 1307
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 387 times
Been thanked: 80 times

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by citRiks »

buniak_a_h wrote: Fri 15 Jan, 2021 23:51 Это на каком языке? Вроде, в lua нет ни goto, ни меток вида ::label::. Или я чего-то не знаю?
да, действительно, в чистом Луа 5.1 нет GOTO.
Но у нас это не чистое Луа 5.1 от производителя, а LuaJit 2.1.0,
кроме других отличий это включает элементы синтаксиса из Луа 5.2,
а в Луа 5.2 уже есть неимоверный прогресс ввиде оператора GOTO, куда ж без него :)
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
John Doe
Бюрократ
Posts: 13075
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 42 times
Been thanked: 319 times

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by John Doe »

citRiks wrote: Fri 15 Jan, 2021 21:23 Да, я знаю что GOTO это плохо, только не знаю почему :)
Если вы обнаружили что goto решает вашу задачу, то с большой долей вероятности это означает что код нуждается в рефакторинге.
Разумеется избавление от goto не должно быть самоцелью, но как-то само собой получается, что после рефакторинга он оказывается не нужен.
https://t.me/FarManager — Telegram чат
citRiks
Posts: 1307
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 387 times
Been thanked: 80 times

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by citRiks »

John Doe,
Ну вот здесь например, лаконично, симметрично, выравнивание типа.
выравнивание позволяет видеть и опечатки и логику, аналогии.
не придумал как без ГОТО получилось бы лучше. есть идеи?

Code: Select all

	...
	AList, act_status = CreateList(APanel, 0, 1)
	if act_status == "userabort" then goto after_create_list end
	PList, pas_status = CreateList(PPanel, 1, 0)
	if pas_status == "userabort" then goto after_create_list end
	::after_create_list::
	...
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
John Doe
Бюрократ
Posts: 13075
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 42 times
Been thanked: 319 times

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by John Doe »

Code: Select all

	...
	AList, act_status = CreateList(APanel, 0, 1)
	if act_status != "userabort" then
		PList, pas_status = CreateList(PPanel, 1, 0)
	end
	...
https://t.me/FarManager — Telegram чат
citRiks
Posts: 1307
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 387 times
Been thanked: 80 times

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by citRiks »

John Doe,
понятно, но симметрия нарушена..
мне лучше понимается когда все симметрично

Я бы сделал опрос, как визуально понятнее с первой доли секунды,
вариант с ГОТО или без ?
Примеры обоего выше
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2561
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 332 times
Contact:

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by buniak_a_h »

John Doe, citRiks,переписка интересная, но для для темы "Ликбез по LUA"
John Doe, это же Ваша тема? Не могли бы Вы добавить туда что-то типа "отличия нашего LUA от стандартного LUA версии 5.1"
Post Reply

Return to “Нужна помощь”