-- Список профилей rebind
-- Клавиша вызова AltShiftR
-- Enter - смена профиля, F3 - просмотр профиля
-- v0.0.1 -- старт
local F,rb = far.Flags,package.loaded.rebind
--
local ReadDB,ShowMenu,ShowProfile -- функции
--
function ReadDB() --[[прочитать данные из БД]]
--local tbl = {[package.loaded.rebind.getCurProfile()]={[0]=true}} -- таблица с данными
local tbl = {} -- таблица с данными
local obj = far.CreateSettings(nil,F.PSL_ROAMING) -- откроем глобальные данные
local list = obj:Enum(0) -- список элементов корня
for _,v in ipairs(list) do -- переберём все
if v.Type==F.FST_SUBKEY then -- подключ? проверим
local skey = obj:OpenSubkey(0,v.Name) -- получим его
if obj:Get(skey,"RebindProfile",F.FST_DATA) then -- найден признак профиля rebind?
local slist = obj:Enum(skey) -- список содержимого профиля
tbl[v.Name] = {} -- заготовим место под профиль
for _,vv in ipairs(slist) do -- переберём все
if vv.Name~="RebindProfile" then tbl[v.Name][vv.Name] = loadstring(obj:Get(skey,vv.Name,F.FST_DATA))() end -- не признак - запишем
end
end
end
end
obj:Free() -- закроем
return tbl -- вернём данные
end -- ReadDB
--
function ShowProfile(tbl,name)
--LE(tbl,name)
local fntbl = {} -- таблица, сгруппированная по файлам
for n,v in pairs(tbl) do -- перпеберём все записи
if not fntbl[v.FileName] then fntbl[v.FileName] = {} end -- для впервые встречающегося файла добавим пустую таблицу под записи
fntbl[v.FileName][n] = {id=n,disabled = v.disabled,description=v.description,key=v.key} -- добавим запись
end
--LE(fntbl)
local items = {} --строки вывода
for n,v in pairs(fntbl) do -- переберём все файлы
items[#items+1] = {text = n,separator=true} -- запишем имя
for nn,vv in pairs(v) do -- переберём все записи для этого файла
items[#items+1] = {text = vv.description or "no description"} -- описание
items[#items+1] = {text = " id: "..nn} -- id
if vv.key then items[#items+1] = {text = " new key: "..vv.key} end -- изменённые клавиши, если есть
if vv.disabled then items[#items+1] = {text = " disabled"} end -- признак отключения, если есть
end
end
far.Menu({Title='Rebind profile "'..name..'"',Flags=F.FMENU_SHOWAMPERSAND+F.FMENU_WRAPMODE},items) -- выведем
end -- ShowProfile
--
function ShowMenu()
--local Bottom,pos,res,HotKeys,DBChanged = "Enter, Esc, F1, F2, F3, F4, F5, F10, Ins, Del, CtrlPgUp, CtrlS",1 -- подсказка, позиция, результат, горячие клавиши
--HotKeys = {{BreakKey="F1"},{BreakKey="F2"},{BreakKey="F3"},{BreakKey="F4"},{BreakKey="F5"},{BreakKey="F10"},
-- {BreakKey="INSERT"},{BreakKey="NUMPAD0"},{BreakKey="DELETE"},{BreakKey="DECIMAL"},{BreakKey="C+PRIOR"},{BreakKey="C+NUMPAD9"},{BreakKey="C+S"}}
local Bottom,HotKeys,pos,res = "Enter, Esc, F3",{{BreakKey="F3"}} -- подсказка, горячие клавиши, позиция, результат
--
repeat -- главный цикл
local tbl = ReadDB() -- прочитаем БД
local CurPrf = rb.getCurProfile() -- имя текущего профиля
local items = {{text=CurPrf,checked="*"}} -- инициализируем список профилей текущим
for n in pairs(tbl) do if n~=CurPrf then items[#items+1] = {text=n} end end -- сформируем заготовку меню
table.sort(items,function(a,b) return a.text<b.text end) -- отсортируем по типу и по имени
for i,v in ipairs(items) do if v.checked then pos = i break end end -- спозиционируемся на текущий профиль
res,pos = far.Menu({Title="Rebind profiles",Bottom=Bottom,SelectIndex=pos--[[,Id=Guids.Menu--]],
Flags=F.FMENU_SHOWAMPERSAND+F.FMENU_WRAPMODE},items,HotKeys) -- меню
if not res then return -- Esc - выход
elseif not res.BreakKey then -- Enter - смена профиля
if res.text~=CurPrf then far.Message([[
Automate Rebind profile changing is not supported now.
For changing open ']]..win.GetEnv("FARPROFILE")..[[\Macros\scripts\_macroinit.lua'
and manualy replace "]]..CurPrf..[[" with "]]..res.text..[[" in "LoadBindings" call.]],"Change Rebind profile",";Ok","l")
else
far.Message([[Selected current Rebind profile "]]..CurPrf..[[".]],"Change Rebind profile",";Ok","l")
end
return
elseif res.BreakKey=="F3" then -- просмотр профиля?
ShowProfile(tbl[items[pos].text] or {},items[pos].text) -- покажем
end
until false
end -- ShowMenu
--
if not Macro then if rb then ShowMenu() end return end -- для запуска по Enter
--
Macro{
id="EA82B929-FDD0-4084-A240-B0F6199299F9";
area="Common";
key="AltShiftR";
description="Test rebind profiles";
condition=function() return not not rb end;
action=ShowMenu;
}