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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 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 266 times
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

Latest post of the previous page:

John Doe wrote:
IgorZ wrote: А что визуализировать?
Содержимое базы. Какие макросы и как переназначены.
Это понятно. Я имел в виду, что в таком виде в принципе неясно, какой профиль активен и, соответственно, откуда выводить.
John Doe wrote:
IgorZ wrote: Как абсолютный минимум, _KEY надо возвращать
Верно. Но не так, а функцией. Или через метаметод.
Пока хотя бы так. Иначе даже не протестировать.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

IgorZ wrote: Пока хотя бы так. Иначе даже не протестировать.
Там всегда будет значение по умолчанию, которое мы и так знаем. Потому что вызов Setup изменит только внутреннюю переменную, а в таблице модуля останется прежнее неактуальное.
Поэтому должно быть что-то типа getCurProfile = function() return _KEY end
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

К выходу luamanager выпускаю и новый rebind (в шапке).
  • Удавил пару багов
  • John Doe wrote: Добавил возможность считывания ключа с произвольным именем через rebind.Setup{profile="REBIND2"} (хотя так получается неконсистентно как-то, ведь уже есть отдельная команда rebind.LoadBindings для загрузки "профиля" из файла)
    Профиль из базы теперь считывается командой LoadBindings (profile,db)
  • John Doe wrote: Поэтому должно быть что-то типа getCurProfile = function() return _KEY end
    Добавил в интерфейс
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

John Doe wrote:
IgorZ wrote:А что визуализировать?
Содержимое базы. Какие макросы и как переназначены.
Подумалось, что визуализировать базу переназначений можно экспортом в файл, с форматом описанным в шапке.
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:Профиль из базы теперь считывается командой LoadBindings (profile,db)
Я так понимаю, вторым параметром надо обязательно указывать любое неложное значение. Надо бы, наверное, уточнить в шапке - не каждый с ходу поймёт.
John Doe wrote:Подумалось, что визуализировать базу переназначений можно экспортом в файл, с форматом описанным в шапке.
Через временный файл? Некрасиво. А заготовки в виде п/п вывода значения таблиц у меня уже давно есть. Чуть подшаманить под конкретную структуру - и готово.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

IgorZ wrote: Через временный файл? Некрасиво.
Что некрасиво-то? А например меню пользователя в редакторе разве некрасиво править?
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: Через временный файл? Некрасиво.
Что некрасиво-то? А например меню пользователя в редакторе разве некрасиво править?
Лишний промежуточный этап.
Впрочем, посмотрим. На выходных попробую набросать вчерне.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

IgorZ wrote: Лишний промежуточный этап.
Заодно и средство правки, и готовый импорт/экспорт. И в коде всё есть для загрузки из файла.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

John Doe wrote:
IgorZ wrote: Через временный файл? Некрасиво.
Что некрасиво-то? А например меню пользователя в редакторе разве некрасиво править?
А где там временный файл?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

far 1.75
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

Обещанный пробник.
Для того, чтобы работать со списком профилей, вставил маленький костыль в rebind, дабы можно было отличать подключи с профилями.
  1. --- rebind.lua.0    Thu Aug 04 17:33:59 2016
  2.  
  3. +++ rebind.lua  Sun Aug 07 23:18:09 2016
  4.  
  5. @@ -225,6 +225,7 @@
  6.  
  7.      mf.mdelete(_KEY,m.id)
  8.  
  9.    end
  10.  
  11.    REBIND[m.id] = Binding
  12.  
  13. +  mf.msave(_KEY,"RebindProfile",_KEY)
  14.  
  15.  end
  16.  
  17.  
  18.  
  19.  ------------------------------------
Чтобы он заработал с уже имевщимся до костыля профилем, надо произвести любую манипуляцию с rebind (к примеру, отключить и снова включить макрос).

Сам скрипт. Пока только минимальная демонстрация возможностей: просмотр списка профилей и самих профилей, а также условная смена профиля. Можно запускать как файл, можно как макрос.
  1. -- Список профилей rebind
  2.  
  3. -- Клавиша вызова AltShiftR
  4.  
  5. -- Enter - смена профиля, F3 - просмотр профиля
  6.  
  7. -- v0.0.1 -- старт
  8.  
  9. local F,rb = far.Flags,package.loaded.rebind
  10.  
  11. --
  12.  
  13. local ReadDB,ShowMenu,ShowProfile -- функции
  14.  
  15. --
  16.  
  17. function ReadDB() --[[прочитать данные из БД]]
  18.  
  19. --local tbl = {[package.loaded.rebind.getCurProfile()]={[0]=true}} -- таблица с данными
  20.  
  21. local tbl = {} -- таблица с данными
  22.  
  23. local obj = far.CreateSettings(nil,F.PSL_ROAMING) -- откроем глобальные данные
  24.  
  25. local list = obj:Enum(0) -- список элементов корня
  26.  
  27. for _,v in ipairs(list) do -- переберём все
  28.  
  29.   if v.Type==F.FST_SUBKEY then -- подключ? проверим
  30.  
  31.     local skey = obj:OpenSubkey(0,v.Name) -- получим его
  32.  
  33.     if obj:Get(skey,"RebindProfile",F.FST_DATA) then -- найден признак профиля rebind?
  34.  
  35.       local slist = obj:Enum(skey) -- список содержимого профиля
  36.  
  37.       tbl[v.Name] = {} -- заготовим место под профиль
  38.  
  39.       for _,vv in ipairs(slist) do -- переберём все
  40.  
  41.         if vv.Name~="RebindProfile" then tbl[v.Name][vv.Name] = loadstring(obj:Get(skey,vv.Name,F.FST_DATA))() end -- не признак - запишем
  42.  
  43.       end
  44.  
  45.     end
  46.  
  47.   end
  48.  
  49. end
  50.  
  51. obj:Free() -- закроем
  52.  
  53. return tbl -- вернём данные
  54.  
  55. end -- ReadDB
  56.  
  57. --
  58.  
  59. function ShowProfile(tbl,name)
  60.  
  61. --LE(tbl,name)
  62.  
  63. local fntbl = {} -- таблица, сгруппированная по файлам
  64.  
  65. for n,v in pairs(tbl) do -- перпеберём все записи
  66.  
  67.   if not fntbl[v.FileName] then fntbl[v.FileName] = {} end -- для впервые встречающегося файла добавим пустую таблицу под записи
  68.  
  69.   fntbl[v.FileName][n] = {id=n,disabled = v.disabled,description=v.description,key=v.key} -- добавим запись
  70.  
  71. end
  72.  
  73. --LE(fntbl)
  74.  
  75. local items = {} --строки вывода
  76.  
  77. for n,v in pairs(fntbl) do -- переберём все файлы
  78.  
  79.   items[#items+1] = {text = n,separator=true} -- запишем имя
  80.  
  81.   for nn,vv in pairs(v) do -- переберём все записи для этого файла
  82.  
  83.     items[#items+1] = {text = vv.description or "no description"} -- описание
  84.  
  85.     items[#items+1] = {text = "       id: "..nn} -- id
  86.  
  87.     if vv.key then items[#items+1] = {text = "  new key: "..vv.key} end -- изменённые клавиши, если есть
  88.  
  89.     if vv.disabled then items[#items+1] = {text = "  disabled"} end -- признак отключения, если есть
  90.  
  91.   end
  92.  
  93. end
  94.  
  95. far.Menu({Title='Rebind profile "'..name..'"',Flags=F.FMENU_SHOWAMPERSAND+F.FMENU_WRAPMODE},items) -- выведем
  96.  
  97. end -- ShowProfile
  98.  
  99. --
  100.  
  101. function ShowMenu()
  102.  
  103. --local Bottom,pos,res,HotKeys,DBChanged = "Enter, Esc, F1, F2, F3, F4, F5, F10, Ins, Del, CtrlPgUp, CtrlS",1 -- подсказка, позиция, результат, горячие клавиши
  104.  
  105. --HotKeys = {{BreakKey="F1"},{BreakKey="F2"},{BreakKey="F3"},{BreakKey="F4"},{BreakKey="F5"},{BreakKey="F10"},
  106.  
  107. --  {BreakKey="INSERT"},{BreakKey="NUMPAD0"},{BreakKey="DELETE"},{BreakKey="DECIMAL"},{BreakKey="C+PRIOR"},{BreakKey="C+NUMPAD9"},{BreakKey="C+S"}}
  108.  
  109. local Bottom,HotKeys,pos,res = "Enter, Esc, F3",{{BreakKey="F3"}} -- подсказка, горячие клавиши, позиция, результат
  110.  
  111. --
  112.  
  113. repeat -- главный цикл
  114.  
  115.   local tbl = ReadDB() -- прочитаем БД
  116.  
  117.   local CurPrf = rb.getCurProfile() -- имя текущего профиля
  118.  
  119.   local items = {{text=CurPrf,checked="*"}} -- инициализируем список профилей текущим
  120.  
  121.   for n in pairs(tbl) do if n~=CurPrf then items[#items+1] = {text=n} end end -- сформируем заготовку меню
  122.  
  123.   table.sort(items,function(a,b) return a.text<b.text end) -- отсортируем по типу и по имени
  124.  
  125.   for i,v in ipairs(items) do if v.checked then pos = i break end end -- спозиционируемся на текущий профиль
  126.  
  127.   res,pos = far.Menu({Title="Rebind profiles",Bottom=Bottom,SelectIndex=pos--[[,Id=Guids.Menu--]],
  128.  
  129.     Flags=F.FMENU_SHOWAMPERSAND+F.FMENU_WRAPMODE},items,HotKeys) -- меню
  130.  
  131.   if not res then return -- Esc - выход
  132.  
  133.   elseif not res.BreakKey then -- Enter - смена профиля
  134.  
  135.     if res.text~=CurPrf then far.Message([[
  136.  
  137. Automate Rebind profile changing is not supported now.
  138.  
  139. For changing open ']]..win.GetEnv("FARPROFILE")..[[\Macros\scripts\_macroinit.lua'
  140.  
  141. and manualy replace "]]..CurPrf..[[" with "]]..res.text..[[" in "LoadBindings" call.]],"Change Rebind profile",";Ok","l")
  142.  
  143.     else
  144.  
  145.       far.Message([[Selected current Rebind profile "]]..CurPrf..[[".]],"Change Rebind profile",";Ok","l")
  146.  
  147.     end
  148.  
  149.     return
  150.  
  151.   elseif res.BreakKey=="F3" then -- просмотр профиля?
  152.  
  153.     ShowProfile(tbl[items[pos].text] or {},items[pos].text) -- покажем
  154.  
  155.   end
  156.  
  157. until false
  158.  
  159. end -- ShowMenu
  160.  
  161. --
  162.  
  163. if not Macro then if rb then ShowMenu() end return end -- для запуска по Enter
  164.  
  165. --
  166.  
  167. Macro{
  168.  
  169.   id="EA82B929-FDD0-4084-A240-B0F6199299F9";
  170.  
  171.   area="Common";
  172.  
  173.   key="AltShiftR";
  174.  
  175.   description="Test rebind profiles";
  176.  
  177.   condition=function() return not not rb end;
  178.  
  179.   action=ShowMenu;
  180.  
  181. }
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

IgorZ wrote: вставил маленький костыль в rebind
Обновил версию в шапке.
Помимо вашей строчки изменения в основном технические: Info для ScriptBrowser, переименованы/дооформлены вспомогательные файлы, добавлен макрос для вставки шаблона в bindings.
IgorZ wrote: Чтобы он заработал с уже имевщимся до костыля профилем, надо произвести любую манипуляцию с rebind
Или запустить из командной строки lua:mf.msave("REBIND","RebindProfile","REBIND")
User avatar
Dennis_Moore
Posts: 295
Joined: Tue 03 Mar, 2015 19:54
Location: Kiev
Has thanked: 6 times
Been thanked: 17 times

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

Post by Dennis_Moore »

При наличии этого макроса - http://forum.farmanager.com/viewtopic.p ... 80#p141180
и rebind получаю ошибку после нажатия CtrlO в редакторе.

Если закомментировать строку rebind.Setup {auto_uids=true,no_warnings=true} в _macroinit.lua то ошибка не появляется. FAR 4972, в более ранних не проверял.

Last edited by Dennis_Moore on Sat 03 Jun, 2017 17:49, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Там строка 63 закомментирована напрасно, по-видимому.
А ещё лучше наверно заменить её на if not filename then return mf.AddMacro(m) end
User avatar
Dennis_Moore
Posts: 295
Joined: Tue 03 Mar, 2015 19:54
Location: Kiev
Has thanked: 6 times
Been thanked: 17 times

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

Post by Dennis_Moore »

John Doe wrote: Mon 05 Jun, 2017 21:26 Там строка 63 закомментирована напрасно, по-видимому.
А ещё лучше наверно заменить её на if not filename then return mf.AddMacro(m) end
Заменил, починилось. Спасибо.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

осмелюсь спросить вот что, лечится ли это?
цитирую сам себя viewtopic.php?p=159603#p159603
Так как у меня Alt<что-нибудь> нужны для модуля PanelAutofilter (от JohnDoe), то AltT:double не работает, я поменял на CtrD:double.
Все круто, кроме того что у меня теперь рушиться модуль "rebind" (viewtopic.php?t=10376)

Code: Select all

╔════════════════════════════════════════════════════════════════════ Error ════════════════════════════════════════════════════════════════════╗
║ C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.dll:                                                                                   ║
║ ...ta\Roaming\Far Manager\Profile\Macros\modules\rebind.lua:47: attempt to index local 'file' (a nil value)                                   ║
║ Stack Traceback                                                                                                                               ║
║ ===============                                                                                                                               ║
║ (2) metamethod C function '__index'                                                                                                           ║
║ (3) Lua upvalue 'MakeUid' at file 'C:\Users\xxxxxx\AppData\Roaming\Far Manager\Profile\Macros\modules\rebind.lua:47'                           ║
║    Local variables:                                                                                                                           ║
║     file = nil                                                                                                                                ║
║     descr = string: ""                                                                                                                        ║
║     (*temporary) = C function: 0x01d78630                                                                                                     ║
║     (*temporary) = string: "≈%s: %s"                                                                                                          ║
║     (*temporary) = nil                                                                                                                        ║
║     (*temporary) = nil                                                                                                                        ║
║     (*temporary) = userdata: 0x03bd8588                                                                                                       ║
║     (*temporary) = string: "attempt to index local 'file' (a nil value)"                                                                      ║
║ (4) Lua upvalue 'AddRegularMacro' at file 'C:\Users\xxxxxx\AppData\Roaming\Far Manager\Profile\Macros\modules\rebind.lua:69'                   ║
║    Local variables:                                                                                                                           ║
║     m = table: 0x03bc0f78  {callbackId:userdata: 0x03bd8588, code:return, callback:userdata: 0x07feee44fc40 (more...)}                        ║
║     filename = nil                                                                                                                            ║
║     currentline = number: -1                                                                                                                  ║
║ (5) Lua function 'AddMacroFromFAR' at file 'C:\Program Files\Far Manager\Plugins\LuaMacro\utils.lua:1149' (best guess)                        ║
║    Local variables:                                                                                                                           ║
║     mode = number: 4                                                                                                                          ║
║     key = string: "MsWheelDown"                                                                                                               ║
║     lang = string: "lua"                                                                                                                      ║
║     code = string: "return"                                                                                                                   ║
║     flags = number: 0                                                                                                                         ║
║     description = string: ""                                                                                                                  ║
║     guid = table: 0x02eb2940  {1:��N� ⌂K��i,�6�M}                                                                                             ║
║     callback = userdata: 0x07feee44fc40                                                                                                       ║
║     callbackId = userdata: 0x03bd8588                                                                                                         ║
║     priority = number: 100                                                                                                                    ║
║     area = string: "Dialog"                                                                                                                   ║
║ (6) upvalue C function 'co_resume'                                                                                                            ║
║ (7) Lua upvalue 'MacroStep' at file 'C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.lua:246'                                          ║
║    Local variables:                                                                                                                           ║
║     handle = table: 0x03d17568  {coro:thread: 0x03a3d928}                                                                                     ║
║     status = string: "suspended"                                                                                                              ║
║     params = table: 0x04700070  {defline:1172, area:Shell, condition:function: 0x046ff2c0, id:EB3566AE-1046-4DEE-97C0-E2BAD78F3AA5 (more...)} ║
║     tp = string: "table"                                                                                                                      ║
║     (*temporary) = Lua function 'FixReturn' (defined at line 211 of chunk C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.lua)         ║
║     (*temporary) = table: 0x03d17568  {coro:thread: 0x03a3d928}                                                                               ║
║ (8) Lua function 'GetInputFromMacro' at file 'C:\Program Files\Far Manager\Plugins\LuaMacro\keymacro.lua:286' (best guess)                    ║
║    Local variables:                                                                                                                           ║
║     macro = table: 0x0312b4f0  {m_id:table: 0x04700010, m_area:1, m_flags:0, m_textkey:CtrlD, m_handle:table: 0x03d17568 (more...)}           ║
║     OldCurState = table: 0x03a39658  {MacroQueue:table: 0x03a396b8, HistoryDisableMask:0, IntKey:16777284}                                    ║
║     value = nil                                                                                                                               ║
╟───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║                                                                    { OK }                                                                     ║
╚═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Но наверное это проблема больше самого rebind-a, напишу и туда
Far Manager, version 3.0.0.5555 x64
Windows 7 x64 SP1 Prof. Ed.
Last edited by citRiks on Fri 13 Mar, 2020 16:20, edited 1 time in total.
Post Reply

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