----[[*D*]]local le = require"le"
local Info = package.loaded.regscript or function(...) return ... end
local nfo = Info {_filename or ...,
name = "SaveRestFilter";
description = "Сохранение / восстановление файловых фильтров";
version = "1.1.1"; --http://semver.org/lang/ru/
author = "BAX";
url = "";
id = "FC5D2F21-600A-418C-8035-157D71232250";
history = [[
24.01.2021 v1.0.1 - стартовая версия
]];
--parent_id = "";
--minfarversion = {3,0,0,4744,0};
files = [[%FARPROFILE%\macros\modules\BAX\FileFilterTools.lua]];
--config = function(nfo,name) end;
help = function(nfo,name)
far.Message([[
В скрипт входят три макроса: сохранение, восстановление фильтра
и добавление к фильтру расширения (возможно, отсутствующего на панели.
Изначально макросы "повешены" на двойные кнопкосочетания: CtrlF-S,
CtrlF-R и CtrlF-A соответственно (требуется макрос MacroEx).]], '', nil, 'l')
end;
--execute = function(nfo,name) end;
--disabled = false;
--options = {};
}
if not nfo then return end
--local O = nfo.options
------------------------------------------------------------------------------------------
local F = far.Flags
local tin = table.insert
local TmpPanel_Id = "B77C964B-E31E-4D4C-8FE5-D6B0C6853E7C"
--*D* {
--local TmpPanelUtils = require"BAX.TmpPanelUtils"
--*D* }
local function FilterToTable(A_P)
local Filt = {Named={}; Ext={}}
local function SaveFilters()
local hDlg = far.AdvControl("ACTL_GETWINDOWINFO").Id
local List = hDlg:send(F.DM_GETDLGITEM, 1)
local bWasSep=false
for i,v in ipairs(List[6]) do
bWasSep = bWasSep or (band(v.Flags, F.LIF_SEPARATOR) == F.LIF_SEPARATOR)
if band(v.Flags, F.LIF_SEPARATOR) == F.LIF_NONE then
local Flags = v.Flags
if band(Flags, F.LIF_CHECKED) == F.LIF_CHECKED then
local nCh = tonumber(band(Flags, 0x000000FF))
if (nCh or 0) > 0 then
local Char = utf8.char(nCh)
local text = v.Text
local t1,_,t3=text:match"(.*)%s*%│%s*(.*)%s*%│%s*(.*)"
local tt = bWasSep and t3 or t1:match"^%s*(.-)%s*$"
if tt and tt:match"%S+" then
if Char then
local _Filt = Filt[bWasSep and 'Ext' or 'Named']
_Filt[Char] = _Filt[Char] or {}
tin(_Filt[Char], tt)
end
end
end
end
end
end
hDlg:send(F.DM_CLOSE, -2)
end -- SaveFilters
Keys"CtrlI"
if A_P == 'P' then panel.SetActivePanel(nil, 0) end
pcall(SaveFilters)
if A_P == 'P' then panel.SetActivePanel(nil, 0) end
return Filt
end -- FilterToTable
---------------------------------------------------
local function TableToFilters(Filt, A_P) local function _TableToFilters()
local SavePan = { PanelDirectory = panel.GetPanelDirectory(nil, 1); -- Куда вернуться (папка)
PanelCurrent = APanel.Current; -- Текущее имя
PanelInfo = panel.GetPanelInfo(nil, 1); -- Отсюда
}
Keys('CtrlI ShiftBS Esc') -- Очищаю старый фильтр
--------------------------
if not next(Filt.Ext) and not next(Filt.Named) then return end
--------------------------
-- Составляю список расширений. Будет во временной панели
local AddStr = {}
for i,v in pairs(Filt.Ext) do
for _,w in ipairs(v) do
table.insert( AddStr, w )
end
end
--------------------------
if #AddStr > 0 then
-- Открытие временной панели на активной панели и добавление в неё расширений
Plugin.Menu(TmpPanel_Id)
--TmpPanelUtils.Add(AddStr)
do
local fn = far.MkTemp('FiFi')
local hf = io.open(fn, 'w')
hf:write(table.concat(AddStr, '\n'))
hf:close()
Plugin.Command(TmpPanel_Id, '+any "' ..fn..'"')
os.remove(fn)
end
--------------------------
-- Отметка расширений
--------------------------
Keys"CtrlI"
for i,v in pairs(Filt.Ext) do
for ii,w in ipairs(v) do
Menu.Select(w, 2, 0)
Keys(i)
end
end -- for i,v in pairs(Filt.Ext)
else -- Отмеченных расширений не было. Просто открываю диалог вильтров
Keys"CtrlI"
end
--------------------------
-- Тут уже открыт диалог фильтра
-- Отметка именованных фильтров
for i,v in pairs(Filt.Named) do
for _,w in ipairs(v) do
local j = Menu.Select(w, 1, 0)
if j > 0 then
Keys(i)
end
end
end -- for i,v in pairs(Filt.Named)
Keys"Enter"
--------------------------
-- Восстановление исходной папки и положения
panel.SetPanelDirectory(nil, 1, SavePan.PanelDirectory)
--------------------------
if Panel.SetPos(0, SavePan.PanelCurrent) == 0 then
panel.RedrawPanel( nil, 1,
{ CurrentItem =SavePan.PanelInfo.CurrentItem;
TopPanelItem=SavePan.PanelInfo.TopPanelItem } )
end
end --_TableToFilters
--[[*D*]]Keys"CtrlI Esc" -- Мистика! Без этого не работает !!!
if A_P == 'P' then panel.SetActivePanel(nil, 0) end
pcall(_TableToFilters)
if A_P == 'P' then panel.SetActivePanel(nil, 0) end
end -- TableToFilters
---------------------------------------------------
Macro{
id="1F253444-B5F8-47E0-9102-A1DD36C9DB14";
area="Shell";
key="CtrlShiftA";
description="Добавление фильтра по расширению (в т.ч. в случае, если расширения на панели нету)";
flags=""; -- EnableOutput RunAfterFARStart EmptyCommandLine NotEmptyCommandLine NoFilePanels NoFilePPanels NoPluginPanels NoPluginPPanels NoFolders NoPFolders NoFiles NoPFiles Selection PSelection NoSelection NoPSelection EVSelection NoEVSelection NoSendKeysToPlugins
action=function(data)
local Filt = FilterToTable(akey(1)== 'CtrlShiftF' and 'P' or 'A')
local function AADD(aArr, item)
if type(item) ~= 'table' then item = {item} end
aArr = aArr or {}
for _,v in ipairs(item) do aArr[#aArr+1] = v end
return aArr
end
local sAdd = far.InputBox(win.Uuid'377A8222-E887-4EE8-A1A7-AE65EAF8CE91','Добавление расширения в фильтр','Введите список [{+|-|I|X}=]маска,…')
if sAdd then
sAdd = sAdd .. ','
local aAdd = {}
local cSim = '+'
for w in sAdd:gmatch"([^,]*)," do
if w:match"%S" then
local _cSim,_Ext = w:match"^([+-IiXx])=(.*)$"
cSim = _cSim or cSim
_Ext = _Ext or w
aAdd[cSim] = AADD(aAdd[cSim], _Ext)
end
end
for i,v in pairs(aAdd) do
Filt.Ext[i] = AADD(Filt.Ext[i], v)
end
TableToFilters(Filt, akey(1)== 'CtrlShiftF' and 'P' or 'A')
end
end;
}