buniak_a_h wrote: ↑Wed 25 May, 2022 01:47
А APanel.Path в это время - другая?
Совсем-совсем...
Возможно, на ситуацию влияет настройка System.Executor.UseHomeDir. К сожаленю, ничего про эту настройку не нашёл
У меня на двух экземплярах ФАР-а ситуация разная: на одной win.GetCurrentDir() всегда равна APanel.Path0, на другой win.GetCurrentDir() вообще не меняется при "хождении" по папкам. От чего зависит, я так и не понял.
Last edited by buniak_a_h on Wed 25 May, 2022 03:30, edited 1 time in total.
Pasha_ZZZ, я уже вспомнил, потому и зачеркнул то, что Вы цитировали.
Но вопрос (кстати, заданный в той же теме Мухой) так и остался без ответа. Как связаны (и связаны ли вообще) win.GetCurrentDir() и APanel.Path0 - я так и не понял.
buniak_a_h wrote: ↑Wed 25 May, 2022 03:58
Но вопрос (кстати, заданный в той же теме Мухой) так и остался без ответа
Вообще-то там разобрались, последнее сообщение в той теме какбэ намекает...
Взял 7z архивы с гитхаба, обеих разрядностей. Из изменений - только инишник поправил для портативности. Пофиг, везде и всегда lua:far.Message(win.GetCurrentDir()) выдает %FARHOME% (ну то есть раскрытый путь из нее).
Pasha_ZZZ wrote: ↑Wed 25 May, 2022 04:09
последнее сообщение в той теме какбэ намекает...
Не-не, там про реестр. А у меня на одном компе два ФАРа ведут себя по-разному. Реестр - один. Отличия в том, что (а) один из ФАРов (он у меня зовётся тестовым) - портативный (far.exe.ini); (б) набором макросов и плагинов (у тестового меньше). Ну, попробую порыть, кто у меня на рабочем ФАРе делает, чтобы win.GetCurrentDir() всегда был равен APanel.Path0. Хотя это логично и удобно.
buniak_a_h wrote: ↑Wed 25 May, 2022 03:06
на одной win.GetCurrentDir() всегда равна APanel.Path0, на другой win.GetCurrentDir() вообще не меняется при "хождении" по папкам. От чего зависит, я так и не понял.
Pasha_ZZZ wrote: ↑Thu 26 May, 2022 06:25
Правильней всего наверное far.ConvertPath(fi)
Это короче, чем формировать через APanel.Path0, но, наверное, менее эффективно. Впрочем, эти микросекунды не стоят того, чтоб жертвовать читабельностью.
Pasha_ZZZ wrote: ↑Thu 26 May, 2022 06:25
Я просто добавил {0,1}, чтобы просто *.sha тоже попадали в маску
buniak_a_h wrote: ↑Tue 24 May, 2022 14:06
(а) Пункт меню сделаю.
Увы, не получилось. При вызове из пункта меню если без mf.postmacro, то возникает
E:\Far.Test\Profile\Macros\scripts\IntChecker.Run.lua:39: attempt to yield across C-call boundary
, а если вызывать плагин через mf.postmacro, то прогресс не рисуется. Кстати, аналогично если вызывать плагин вообще не из макроса, а из скрипта, вызываемого по префиксу lua:@<Lua-файл>
Кроме того, проверку по хэш-суммам вынес из того скрипта, что в коробке, сократил и повесил на Ctrl+Shift+H.
Итак.
local ICId = "E186306E-3B0D-48C1-9668-ED7CF64C0E65"
local Mask="/.+\\.(md5|sfv|sha(1|3|256|512){0,1}|wrpl)/i";
local HotKey = "CtrlShiftH"
local function ChkMask(CheckOnly)
local res = nil
for i=1,math.max(1,APanel.SelCount) do
local fit = panel.GetSelectedPanelItem(nil,1,i)
if not fit.FileAttributes:match'd' and mf.fmatch(fit.FileName, Mask) == 1 then
if CheckOnly then
return true
else
res = res or {}
res[#res+1] = fit.FileName
end
end
end
return res
end
local function Action()
local fn = far.MkTemp('ick')
local hn = io.open(fn, 'w')
--local curd = APanel.Path
--if curd:sub(-1) ~= '\\' then curd = curd .. '\\' end
local aDone = {}
local aQueue = ChkMask(false)
while aQueue[1] do
local fi = table.remove(aQueue,1)
local hi = io.open(far.ConvertPath(fi), 'r')
hn:write(hi:read("*a"))
hi:close()
Panel.Select(0, 0, 2, fi)
end
hn:close()
if #aDone > 0 then Panel.Select(0, 0, 2, table.concat(aDone, '\n')) end
--Action(fn)
Far.DisableHistory(-1) Plugin.Command(ICId, fn);
win.DeleteFile(fn)
end
Macro{
id="FF680B94-4A6A-4C3A-A879-7186D03DDF66";
area="Shell";
key=HotKey;
description="Integrity Checker: check integrity use check summ for selected files (BAX)";
priority=60;
flags="EnableOutput EmptyCommandLine";
condition=function(key, data) return ChkMask(true) end;
action=function(data)
Action()
end;
}
MenuItem {
description = 'Проверка файлов по хэш-суммам';
menu = 'Plugins';
area = 'Shell';
guid = '2BF12269-22F5-468E-99E1-CBF07C433B07';
text = function(menu, area)
if ChkMask(true) then return 'BAX - проверка по хэш-суммам' end
end;
action = function(OpenFrom, Item)
mf.postmacro(Action) -- так хотя бы работает, хоть и не визуализирует прогресс
end;
}
Выделение снимается перед проверкой, поэтому после отмены его тоже нет. Наверное некритично, лучше так, чем оставлять и после проверки.
Отметка снимается при копировании "частного" файла во временный "объединённый". По-другому никак; плагин не разделяет, текст какого из отмеченных файлов обрабатывается.
buniak_a_h wrote: ↑Fri 27 May, 2022 20:59
Увы, не получилось.
Через Keys тоже не получится? Тогда уж лучше совсем без меню.
Получилось. Замените на mf.postmacro(mf.eval, 'Shell/'..HotKey, 2) - работает, вроде!
Pasha_ZZZ wrote: ↑Sat 28 May, 2022 11:42
И еще: зачем там во флагах EmptyCommandLine? В этом скрипте комстрока никому не мешает ведь.
Ну, забыл… Осталось с тех времён, когда хоткеем был Enter. Ну, уберите. Я уж не буду перевыкладывать.
P/S. Набралось несколько изменений - так что новая версия тут: