Имеется макрос, который расчитан на работу с одним файлом. Хочется применить его ко всем выделенным файлам (последовательно). Это легко делается через CtrlG. lua:eval("AltShiftV",2) (AltShiftV - для вызова моего макроса). Проблема в том, что данную команду надо выбирать из списка прошлых команд. Если повесить на F2 просто команду, то она выполняется только для одного файла, что естественно. Вопрос как сделать вызов макроса для всех выделенных файлов?
Volodya, макрос чем хорош: его можно подстроить "под себя". В Вашем случае я бы легко переделал его таким образом, чтобы он принимал либо имя текущего файла (если нет отмеченных), либо в цикле выполнял акцию для отмеченных. Из Вашего вызова не видно, где Вы передаёте собственно имя файла; если макрос делает нечто для APanel.Current, то CtrlG (и метасимвол !&) Вам не помогут.
Macro{
id="8D4918FA-D041-4CB4-A79A-D204988D98D6"; -- Заменить на уникальный GUID
area="Shell";
key="AltShiftV";
description="Тест для https://forum.farmanager.com/viewtopic.php?p=169603#p169603";
flags=""; -- EnableOutput RunAfterFARStart EmptyCommandLine NotEmptyCommandLine NoFilePanels NoFilePPanels NoPluginPanels NoPluginPPanels NoFolders NoPFolders NoFiles NoPFiles Selection PSelection NoSelection NoPSelection EVSelection NoEVSelection NoSendKeysToPlugins
action=function(data)
local aDone={}
for i=1, APanel.Selected and APanel.SelCount or 1 do
local FName = panel.GetSelectedPanelItem(nil, 1, i).FileName
if not far.Show('14: FileName='..FName) then break end -- Здесь заменять на реальное действие
aDone[#aDone+1] = '"' .. FName .. '"'
end
Panel.Select(0, 0, 2, table.concat(aDone, '\n'))
end;
}
local bufFileTimes={} -- Внутренний буфер хранения даты/времени
local function UpdateBranch() --Установка даты/времени родительских папок по дате/времени текщего элемента
if Area.Shell then
local Path = panel.GetPanelDirectory(nil,1).Name
local Times = win.GetFileTimes(Path .. "\\" .. panel.GetCurrentPanelItem(nil,1).FileName)
local result
repeat
result = win.SetFileTimes(Path,Times)
Path = Path:match("(.*)\\[\\]+$")
until (Path:find(":$") ~= nil and result)
panel.UpdatePanel(nil,1)
panel.RedrawPanel(nil,1) --почему-то после UpdatePanel обновляется все кроме радительской папки (это та что "..")
return result
end
end
local function CopyTimes() --Копирование даты/времени текщего элемента
if Area.Shell then
bufFileTimes = win.GetFileTimes(panel.GetPanelDirectory(nil,1).Name .. "\\" .. panel.GetCurrentPanelItem(nil,1).FileName)
return bufFileTimes
end
end
local function PasteTimes(Times) --Установка даты/времени текщего элемента
Times = Times or bufFileTimes
if Area.Shell then
local result = win.SetFileTimes(panel.GetPanelDirectory(nil,1).Name .. "\\" .. panel.GetCurrentPanelItem(nil,1).FileName, Times)
panel.UpdatePanel(nil,1)
panel.RedrawPanel(nil,1) --почему-то после UpdatePanel обновляется все кроме радительской папки (та что "..")
return result
end
end
local Shell_FileTime={
UpdateBranch = UpdateBranch;
CopyTimes = CopyTimes ;
PasteTimes = PasteTimes ;
}
local function filename() return UpdateBranch() end
if _filename then return filename(...) end
if not Macro then return {Shell_FileTime=Shell_FileTime} end
buniak_a_h wrote: ↑Wed 05 Jan, 2022 12:42
я бы легко переделал его таким образом, чтобы он принимал либо имя текущего файла (если нет отмеченных), либо в цикле выполнял акцию для отмеченных.
Я был бы признателен, если бы вы его модифицировали указанным образом.
Просто мне кажется, что для Copy (запомнить время) смысла нет, а с третьей процедурой ("Обновление даты/времени записи родительских папок" я не разбирался но тоже, вроде, нет смысла