rebind — управление клавишами вызова макросов

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

rebind — управление клавишами вызова макросов

Post by John Doe »


Ниже предлагается простое централизованное решение, позволяющее отключить любой сторонний макрос, или переопределить его клавиатурную комбинацию.
Прототип обсуждался ранее, а теперь всё это можно делать интерактивно, с помощью одного из двух альтернативных макро браузеров:
  • http://forum.farmanager.com/viewtopic.php?f=60&t=7936 (подробности в шапке темы)
  • MacroBrowser подробности тут:
Все настройки (состояние запрета и переназначенные клавиши) сохраняются в базе, и загружаются при запуске фара.
Также поддерживается альтернативный способ хранения настроек, в файле %FARPROFILE%\Macros\scripts\bindings.

Всё что требуется для работы перечисленных функций — это подключить в _macroinit.lua модуль rebind: require"rebind".
На практике полезно дополнительно настроить модуль:

Об идентификаторах макросов:

Требования: Far 3.0 build >4743 (luamacro build 580)
Attachments
rebind-1.1.7z
(5.15 KiB) Downloaded 275 times
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

rebind — управление клавишами вызова макросов

Post by zg »

Latest post of the previous page:

какое преимущество даёт отказ от валидных гуидов?
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

rebind — управление клавишами вызова макросов

Post by John Doe »

1. Возможность использовать в качестве идентификатора произвольную строку, с осмысленным названием.
Макрос ведь не бинарник, поэтому особая строгость и не нужна, имхо.

2. Возможность использовать "условно-постоянные" сгенерированные идентификаторы, на время пока (г)уиды не будут приняты большинством авторов Update хотя при желании гуид можно сделать и из хэша строки..
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

rebind — управление клавишами вызова макросов

Post by Shmuel »

zg wrote: какое преимущество даёт отказ от валидных гуидов?
Для непродвинутых авторов легче написать id="Вася", чем непонятно откуда брать валидный гуид. И при этом "Вася" будет более уникальным, чем опустить это поле. (Это так, мысли вслух).
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

rebind — управление клавишами вызова макросов

Post by IgorZ »

John Doe wrote:
IgorZ wrote: Как разработчик, я предпочёл бы обязательное указание guid. Очень облегчило бы жизнь.
Пользователи не оценят.
Да я понимаю. Но помечтать-то можно?
John Doe wrote:
IgorZ wrote: На мой взгляд, если уж делать, то с возможностью заменять значение любой статической переменной. После загрузки содержимого файла это вполне реально.
После загрузки уже поздно.
Да и использования debug-функций очень хочется избежать.
Да, не подумал. Впрочем, если извращаться, можно считать всё содержимое файла в переменную, в памяти поправить в тексте значение изменяемых локальных переменных и загрузить правленый текст. В общем-то даже почти не извращение получается.
John Doe wrote:
IgorZ wrote: сгенерировать uid по шаблону, наподобие того, как это делается сейчас из имени файла и описания
Это не есть хорошо.
Но в rebind мы можем продолжать это делать, во всяком случае пока uid/guid как стандартное поле не будет принят большинством авторов.
Тогда уж пока uid/guid не станет обязательным полем (то есть, очень долго, если не вечно). Ибо совместимость со старыми макросами.
John Doe wrote:
IgorZ wrote: дописать в исходный файл в определение макроса.
luamacro не трогает макрофайлы, и не вижу причин для чего бы ему начинать.
Но это можно делать прямо в луа менеджере.
А это предлагалось делать на уровне LuaMacro. Но пока я писал, Shmuel отказался от подобного в принципе. А LuaManager и так это делает при редактировании макроса.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

rebind — управление клавишами вызова макросов

Post by John Doe »

IgorZ wrote: Тогда уж пока uid/guid не станет обязательным полем (то есть, очень долго, если не вечно). Ибо совместимость со старыми макросами.
Ну нет. Старым макросам мы ничем не обязаны, их каждый может поправить самостоятельно (причём не гуиды, а сразу клавиши и всё остальное).
А речь в первую очередь про поддерживаемые макросы, для которых обновления постятся, и в которые самостоятельно гуиды проставлять бессмысленно, т.к. следующее обновление всё затрёт.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

rebind — управление клавишами вызова макросов

Post by IgorZ »

John Doe wrote: Старым макросам мы ничем не обязаны, их каждый может поправить самостоятельно (причём не гуиды, а сразу клавиши и всё остальное).
А речь в первую очередь про поддерживаемые макросы, для которых обновления постятся, и в которые самостоятельно гуиды проставлять бессмысленно, т.к. следующее обновление всё затрёт.
Пардон, выразился неточно. "Старыми" я обозвал макросы без uid. Подозреваю, ещё очень долго многие скриптописатели будут игнорировать uid и писать новые макросы без него.
Last edited by Guest on Mon 18 Jul, 2016 12:32, edited 1 time in total.
Reason: Удалён оверквотинг
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

rebind — управление клавишами вызова макросов

Post by Shmuel »

С макросами как-то понятно зачем нужен Id. А как насчёт Event, CommandLine - надо это?
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

rebind — управление клавишами вызова макросов

Post by John Doe »

Применяться может как минимум для того, что включить/отключить
В Event имеет практический смысл изменять filemask
В CommandLine — префиксы
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

rebind — управление клавишами вызова макросов

Post by Shmuel »

Сделал для Macro и Event. Дальше видно будет. Можно тестировать и критиковать.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

rebind — управление клавишами вызова макросов

Post by John Doe »

Code: Select all

LuaMacro: в таблицы определений Macro и Event добавлено опциональное поле "id" типа string.
Мысли вслух: теперь надо пойти проверить, не отвалилось ли чего в моих скриптах, ведь поле id во внутренней таблице существовало и раньше, только с другим содержанием (а теперь оно переименовано в index)..
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

rebind — управление клавишами вызова макросов

Post by John Doe »

John Doe wrote: LuaMacro: в таблицы определений Macro и Event добавлено опциональное поле "id" типа string.
Выложил в шапку очень быстрый фикс, учитывающий последние изменения.
Макросы с uid тоже пока поддерживаются.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

rebind — управление клавишами вызова макросов

Post by Smitis »

Как я понял, id это не guid (т.е. не обязательно guid)?
Разум когда-нибудь победит.
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

rebind — управление клавишами вызова макросов

Post by Shmuel »

Smitis wrote: Как я понял, id это не guid (т.е. не обязательно guid)?
Пока сделано так, если есть аргументы против, давайте обсуждать.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

rebind — управление клавишами вызова макросов

Post by IgorZ »

John Doe wrote:
John Doe wrote: LuaMacro: в таблицы определений Macro и Event добавлено опциональное поле "id" типа string.
Выложил в шапку очень быстрый фикс, учитывающий последние изменения.
Макросы с uid тоже пока поддерживаются.
Подправил LuaManager. Версию rebind с поддержкой Event следует ждать в ближайшее время? Хотелось бы потестировать и эту часть перед выкладкой.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

rebind — управление клавишами вызова макросов

Post by John Doe »

IgorZ wrote: Версию rebind с поддержкой Event следует ждать в ближайшее время?
Я не тестировал (совсем), но если хотите, то давайте попробуем
  1. local nfo = {
  2.  
  3.   name        = "module: rebind.lua";
  4.  
  5.   description = "easy control of macro bindings etc";
  6.  
  7.   version     = "1";
  8.  
  9.   author      = "jd";
  10.  
  11.   url         = "http://forum.farmanager.com/viewtopic.php?f=15&t=10376";
  12.  
  13.   id          = "C0C38A84-1F6D-436D-96D6-7053AC7BEA4F";
  14.  
  15.   minfarversion = {3,0,0,4743,0}; --requires Far 3.0 build >4743 (LuaMacro 580)
  16.  
  17. }
  18.  
  19.  
  20.  
  21. local F = far.Flags
  22.  
  23.  
  24.  
  25. local Info = package.loaded.regscript
  26.  
  27. if Info then
  28.  
  29.   Info(nfo)
  30.  
  31. elseif select(4,far.AdvControl(F.ACTL_GETFARMANAGERVERSION,true))<=nfo.minfarversion[4] then
  32.  
  33.   error("requires FAR 3 build>"..nfo.minfarversion[4])
  34.  
  35. end
  36.  
  37.  
  38.  
  39. local _NAME = nfo.name
  40.  
  41. local _KEY = "REBIND" -- default key name in luamacro db
  42.  
  43.  
  44.  
  45. for i=1,math.huge do
  46.  
  47.   local m = mf.GetMacroCopy(i)
  48.  
  49.   if m then -- ensure that loaded before any macro
  50.  
  51.     if m.FileName then error(_NAME.." should be loaded in '_macroinit.lua'",2) end
  52.  
  53.   else
  54.  
  55.     break
  56.  
  57.   end
  58.  
  59. end
  60.  
  61.  
  62.  
  63. local REBIND --loaded settings
  64.  
  65.  
  66.  
  67. local usedUids = {}
  68.  
  69. local auto_uids,no_warnings
  70.  
  71.  
  72.  
  73. local function MakeUid(file,descr)
  74.  
  75.   return ("≈%s: %s"):format(file:match"[^\\]+$",descr or 'nil') -- ±≠≡∞ƒ≈
  76.  
  77. end
  78.  
  79.  
  80.  
  81. local editall
  82.  
  83. local function editBadUid(id,file,pos)
  84.  
  85.   local msg = ("%s:%s: id is not unique:\n%q"):format(file,pos,id)
  86.  
  87.   local buttons = "Skip;&Skip all;&Edit;Edit &all"
  88.  
  89.   local ans = editall or far.Message(msg,"Warning",buttons,"wl")
  90.  
  91.   if ans==4 then editall = bor(F.EF_NONMODAL,F.EF_IMMEDIATERETURN) end
  92.  
  93.   if editall or ans==3 then editor.Editor(file,nil,nil,nil,nil,nil,editall,pos) end
  94.  
  95.   if ans==2 then no_warnings = true end
  96.  
  97. end
  98.  
  99.  
  100.  
  101. local LoadedMacros --array, forward decl.
  102.  
  103.  
  104.  
  105. local new_fields = {"rebinded","defline","disabled","bindfrom"} --info to store
  106.  
  107. local function AddMacroNew(m,filename)
  108.  
  109.   if type(m)~="table" then return end
  110.  
  111.   --if m.guid then return mf.AddMacro(m,filename) end --MCTL_ADDMACRO
  112.  
  113.   local currentline = debug.getinfo(3,"l").currentline --todo check timings
  114.  
  115.   --if currentline==-1 then le(debug.getinfo(3)) end --fixme
  116.  
  117.   m.defline = currentline~=-1 and currentline
  118.  
  119.   m.id = m.id or m.uid or auto_uids and MakeUid(filename,m.description)
  120.  
  121.   if not m.id or type(m.id)~="string" then --luacheck: ignore 542
  122.  
  123.     --just skip
  124.  
  125.   elseif not usedUids[m.id:lower()] then          --check if id is unique
  126.  
  127.     local Binding = REBIND[m.id:lower()] or {}
  128.  
  129.     if Binding.key then m.rebinded,m.key = m.key,Binding.key end
  130.  
  131.     m.disabled = Binding.disabled
  132.  
  133.     m.bindfrom = Binding.bindfrom
  134.  
  135.   else
  136.  
  137.     if not no_warnings then editBadUid(m.id,filename,currentline) end
  138.  
  139.     m.id = nil
  140.  
  141.   end
  142.  
  143.   local Macro = mf.AddMacro(m,filename)
  144.  
  145.   if Macro and Macro.id and Macro.id~="<no id>" then
  146.  
  147.     for _,field in ipairs(new_fields) do Macro[field] = Macro[field] or m[field] end
  148.  
  149.     usedUids[Macro.id:lower()] = Macro.index
  150.  
  151.   end
  152.  
  153.   return Macro
  154.  
  155. end
  156.  
  157.  
  158.  
  159. local function AddEventNew(m,filename)
  160.  
  161.   if type(m)~="table" then return end
  162.  
  163.   local currentline = debug.getinfo(3,"l").currentline
  164.  
  165.   m.defline = currentline~=-1 and currentline
  166.  
  167.   m.id = m.id or m.uid or auto_uids and MakeUid(filename,m.description)
  168.  
  169.   if not m.id or type(m.id)~="string" then --luacheck: ignore 542
  170.  
  171.     --just skip
  172.  
  173.   elseif not usedUids[m.id:lower()] then          --check if id is unique
  174.  
  175.     local Binding = REBIND[m.id:lower()] or {}
  176.  
  177.     m.disabled = Binding.disabled
  178.  
  179.     m.bindfrom = Binding.bindfrom
  180.  
  181.   else
  182.  
  183.     if not no_warnings then editBadUid(m.id,filename,currentline) end
  184.  
  185.     m.id = nil
  186.  
  187.   end
  188.  
  189.   local Event = mf.AddEvent(m,filename)
  190.  
  191.   if Event and Event.id and Event.id~="<no id>" then
  192.  
  193.     Event.original_condition = Event.condition
  194.  
  195.     local prio = Event.priority or 50
  196.  
  197.     Event.condition = function(...)
  198.  
  199.       if not Event.disabled then
  200.  
  201.         return not Event.original_condition and prio or Event.original_condition(...)
  202.  
  203.       end
  204.  
  205.     end
  206.  
  207.     for _,field in ipairs(new_fields) do Event[field] = Event[field] or m[field] end
  208.  
  209.     usedUids[Event.id:lower()] = Event.index
  210.  
  211.   end
  212.  
  213.   return Event
  214.  
  215. end
  216.  
  217.  
  218.  
  219. do --get LoadedMacros, set AddMacro
  220.  
  221.   local function getUpvalue(f,name)
  222.  
  223.     for i=1,1000 do
  224.  
  225.       local k,v = debug.getupvalue (f,i)
  226.  
  227.       if k==nil then
  228.  
  229.         error("unable to get upvalue: "..name)
  230.  
  231.       end
  232.  
  233.       if k==name then return v,i end
  234.  
  235.     end
  236.  
  237.   end
  238.  
  239.   LoadedMacros = getUpvalue(mf.GetMacroCopy,"LoadedMacros")
  240.  
  241.   local LoadMacros = getUpvalue(eval,"utils").LoadMacros
  242.  
  243.   local AddMacro,iAddMacro = getUpvalue(LoadMacros,"AddRegularMacro")
  244.  
  245.   local AddEvent,iAddEvent = getUpvalue(LoadMacros,"AddEvent")
  246.  
  247.   if not mf.AddMacro then mf.AddMacro,mf.AddEvent = AddMacro,AddEvent end --luacheck: new globals mf
  248.  
  249.   debug.setupvalue (LoadMacros,iAddMacro,AddMacroNew)
  250.  
  251.   debug.setupvalue (LoadMacros,iAddEvent,AddEventNew)
  252.  
  253. end
  254.  
  255.  
  256.  
  257. ---------------------------------------
  258.  
  259. -- public functions [common]
  260.  
  261.  
  262.  
  263. local function Setup(options)
  264.  
  265.   assert(type(options)=="table")
  266.  
  267.   auto_uids = options.auto_uids or auto_uids
  268.  
  269.   no_warnings = options.no_warnings or no_warnings
  270.  
  271. end
  272.  
  273.  
  274.  
  275. ---------------------------------------
  276.  
  277. -- public functions [settings in files]
  278.  
  279.  
  280.  
  281. local function Rebind(m)
  282.  
  283.   local id = m.id or m.uid or m.FileName and m.description and
  284.  
  285.               MakeUid(m.FileName, m.description)
  286.  
  287.   local err = type(m)~="table" and "arg must be table"
  288.  
  289.               or not id and "macro id must be specified"
  290.  
  291.   local info = debug.getinfo(2,"lS")
  292.  
  293.   local bindfrom = {FileName=info.source:match"@?(.+)", defline=info.currentline} --names must match
  294.  
  295.   if err then
  296.  
  297.     err = ("%s\n%s:%s"):format(err,bindfrom.FileName,bindfrom.defline)
  298.  
  299.     far.Message(err,_NAME,nil,"w")
  300.  
  301.   else
  302.  
  303.     REBIND[id:lower()] = { disabled=m.disabled, key=m.key, bindfrom=bindfrom }
  304.  
  305.   end
  306.  
  307. end
  308.  
  309.  
  310.  
  311. local mloadkey --fwd decl.
  312.  
  313. local function LoadBindings(profile,db)
  314.  
  315.   assert(not profile or type(profile)=="string")
  316.  
  317.   if db then
  318.  
  319.     REBIND = mloadkey(profile or _KEY) or {}
  320.  
  321.     _KEY = profile
  322.  
  323.   else
  324.  
  325.     profile = profile or win.GetEnv"FARPROFILE" .. [[\Macros\scripts\bindings]]
  326.  
  327.     local f,err = loadfile(profile)
  328.  
  329.     if err then far.Message(err,_NAME,nil,"w"); return end
  330.  
  331.     local success,res = pcall(setfenv(f, {Rebind=Rebind, NoRebind=function()end}))
  332.  
  333.     if not success then far.Message(res,_NAME,nil,"w"); return end
  334.  
  335.   end
  336.  
  337.   --le(REBIND)
  338.  
  339. end
  340.  
  341.  
  342.  
  343. --[[
  344.  
  345. do
  346.  
  347. REBIND = {}
  348.  
  349. return {
  350.  
  351.   Setup=Setup,
  352.  
  353.   Rebind=Rebind,
  354.  
  355.   LoadBindings=LoadBindings,
  356.  
  357. }
  358.  
  359. end
  360.  
  361. --]]
  362.  
  363.  
  364.  
  365. -------------------------------------
  366.  
  367. -- private functions [settings in db]
  368.  
  369.  
  370.  
  371. function mloadkey(key)
  372.  
  373.   local obj = far.CreateSettings()
  374.  
  375.   local tbl
  376.  
  377.   local subkey = obj:OpenSubkey(0, key)
  378.  
  379.   if subkey then
  380.  
  381.     tbl = {}
  382.  
  383.     local enum = obj:Enum(subkey)
  384.  
  385.     for i = 1,enum.Count do
  386.  
  387.       local name = enum[i].Name
  388.  
  389.       local chunk = obj:Get(subkey, name, F.FST_DATA)
  390.  
  391.       tbl[name:lower()] = assert(loadstring(chunk))()
  392.  
  393.     end
  394.  
  395.   end
  396.  
  397.   obj:Free()
  398.  
  399.   return tbl
  400.  
  401. end
  402.  
  403. REBIND = mloadkey(_KEY) or {}
  404.  
  405.  
  406.  
  407. local function GetMacroIdx(id)
  408.  
  409.   assert(id,"macro id not specified")
  410.  
  411.   local idx = usedUids[id:lower()]
  412.  
  413.   return idx, not idx and "specified macro not found" or nil
  414.  
  415. end
  416.  
  417.  
  418.  
  419. local function GetMacro(id)
  420.  
  421.   local idx,err = GetMacroIdx(id)
  422.  
  423.   return idx and LoadedMacros[idx], err
  424.  
  425. end
  426.  
  427.  
  428.  
  429. local function SaveMacro(m,keys) --expects correct args
  430.  
  431.   local Binding
  432.  
  433.   --if keys is not specified then look for current key (if rebinded)
  434.  
  435.   keys = keys or (keys==nil) and m.rebinded and m.key
  436.  
  437.   if m.disabled or keys then
  438.  
  439.     Binding = { key         = keys or nil, -- false == revert to original
  440.  
  441.                 disabled    = m.disabled or nil,
  442.  
  443.                 description = m.description,
  444.  
  445.                 FileName    = m.FileName }
  446.  
  447.     mf.msave(_KEY,m.id,Binding)
  448.  
  449.   else
  450.  
  451.     mf.mdelete(_KEY,m.id)
  452.  
  453.   end
  454.  
  455.   REBIND[m.id] = Binding
  456.  
  457. end
  458.  
  459.  
  460.  
  461. ------------------------------------
  462.  
  463. -- public functions [settings in db]
  464.  
  465.  
  466.  
  467. local function MacroRebind(id,keys)
  468.  
  469.   assert(type(keys or nil)=="string","'key' must be string")
  470.  
  471.   local m,err = GetMacro(id)               --macro with specified id must be loaded
  472.  
  473.   if err                                   --id not found
  474.  
  475.          or keys=="" and not m.rebinded    --nothing to do: empty keys
  476.  
  477.          or keys==m.key then               --nothing to do: unchanged keys
  478.  
  479.     return nil,err or "nothing to do"
  480.  
  481.   elseif keys=="" or keys==m.rebinded then --if keys are empty or match to original
  482.  
  483.     keys = false                           --THEN need to delete record from base
  484.  
  485.   end                                      --(false == revert to original)
  486.  
  487.   SaveMacro(m,keys)
  488.  
  489.   return true --!! macros reload needed to apply rebind
  490.  
  491. end
  492.  
  493.  
  494.  
  495. local function MacroDisable(id,disable)
  496.  
  497.   local m,err = GetMacro(id)
  498.  
  499.   if err then
  500.  
  501.     return nil,err
  502.  
  503.   elseif type(disable)=="boolean" then
  504.  
  505.     m.disabled = disable        --set if true|false
  506.  
  507.   else
  508.  
  509.     m.disabled = not m.disabled --otherwise toggle
  510.  
  511.   end
  512.  
  513.   SaveMacro(m)
  514.  
  515.   return m.disabled
  516.  
  517. end
  518.  
  519.  
  520.  
  521. -----------------------------------
  522.  
  523. -- extra functions [settings in db]
  524.  
  525.  
  526.  
  527. local function MessagePopup(msg,title,flags,delay) --private
  528.  
  529.   local s = far.SaveScreen()
  530.  
  531.   far.Message(msg,title or "","",flags)
  532.  
  533.   win.Sleep(delay or 500); far.RestoreScreen(s)
  534.  
  535. end
  536.  
  537.  
  538.  
  539. local function MacroRebind_Prompt(id)
  540.  
  541.   local idx,err = GetMacroIdx(id)
  542.  
  543.   if err then far.Message(id or "nil",err,nil,"w"); return end --todo
  544.  
  545.   local m = mf.GetMacroCopy(idx)
  546.  
  547.   local title = "Enter new key"..
  548.  
  549.                 (m.rebinded and (" [orig.: %s]"):format(m.rebinded) or "")
  550.  
  551.   local msg = ("Macro: %q"):format(m.description or "index="..m.index)
  552.  
  553.   local flags = F.FIB_ENABLEEMPTY + F.FIB_BUTTONS
  554.  
  555.   local keys = far.InputBox(nil,title,msg,id,m.key,nil,nil,flags)
  556.  
  557.   if not keys then return end
  558.  
  559.   local success,err = MacroRebind(id,keys) --luacheck: ignore 411/err
  560.  
  561.   if err then mf.postmacro(MessagePopup,err) else return success end
  562.  
  563. end
  564.  
  565.  
  566.  
  567. local function MacroDisable_Msg(id,disable)
  568.  
  569.   local disabled,err = MacroDisable(id,disable)
  570.  
  571.   if err then
  572.  
  573.     far.Message(id or "nil",err,nil,"w")
  574.  
  575.   else
  576.  
  577.     mf.postmacro(MessagePopup,disabled and "disabled" or "enabled")
  578.  
  579.   end
  580.  
  581.   return not err and disabled,err
  582.  
  583. end
  584.  
  585.  
  586.  
  587. return {
  588.  
  589.   _NAME=_NAME,
  590.  
  591.   _VERSION=nfo.version,
  592.  
  593.   _URL=nfo.url,
  594.  
  595.   getCurProfile = function() return _KEY end,
  596.  
  597.  
  598.  
  599.   Setup=Setup,
  600.  
  601. --[settings in files]
  602.  
  603.   Rebind=Rebind,
  604.  
  605.   LoadBindings=LoadBindings,
  606.  
  607. --[settings in db]
  608.  
  609.   MacroRebind=MacroRebind,    --(id), return: (true) or (nil,err)
  610.  
  611.   MacroDisable=MacroDisable,  --(id[,disable]), return (current status) or (nil,err)
  612.  
  613. --sample helpers [settings in db]
  614.  
  615.   MacroRebind_Prompt=MacroRebind_Prompt,
  616.  
  617.   MacroDisable_Msg=MacroDisable_Msg,
  618.  
  619. --  GetMacroIdx,
  620.  
  621. }
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

rebind — управление клавишами вызова макросов

Post by IgorZ »

В силу вариативности будущего занялся тестированием только сейчас. Не знаю, насколько это ещё актуально, но вот предлагаемые исправления найденных ошибок:
  1. 55c55
  2.  
  3. <   if Macro and Macro.id and m.id then
  4.  
  5. ---
  6.  
  7. >   if Macro and Macro.id then
  8.  
  9. 66c66
  10.  
  11. <   m.id = m.id or m.uid or auto_uids and MakeUid(filename,m.description)
  12.  
  13. ---
  14.  
  15. >   m.id = m.id or m.id or auto_uids and MakeUid(filename,m.description)
  16.  
  17. 78c78
  18.  
  19. <   if Event and Event.id and m.id then
  20.  
  21. ---
  22.  
  23. >   if Event and Event.id then
  24.  
  25. 179c179
  26.  
  27. <   local idx = usedUids[id:lower()]
  28.  
  29. ---
  30.  
  31. >   local idx = usedUids[id]
Исправляет ошибки с повторяющимися id/uid; с id/uid, заданном с использованием верхнего регистра; с Event, содержащим поле uid.

Кроме того, тестировал на стабильной версии 4700 (чистый профиль, только стандартные плагины, из скриптов только rebind и его вызов в _macroinit.lua) и наткнулся на такое поведение: при выборе "Cancel" сообщение из error не выводится на экран (вставляемый перед ним для проверки far.Show отрабатывает нормально), в package.loaded.rebind содержится userdata.

К тому же (в любой версии) вставляемый в Event condition при редактировании всплывает вместо заданного, что вообще никуда не годится. Вдобавок, в стабильной версии это мешает корректно найти определение Event.

Пока всё.

Ах, да. Идея на "подумать". Если в определении Macro/Event есть неизвестные поля, скидывать их в виде таблицы в поле с именем "additional" или "nonstandard" или ещё как-то в этом духе.
Post Reply

Return to “Обсуждение макросов”