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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 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 272 times
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Latest post of the previous page:

Будет немного проще. Обсудим по факту.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

IgorZ wrote: Разумеется, это всё программа-максимум, как я её вижу.
Давайте начнём с минимума.
Добавил возможность считывания ключа с произвольным именем через rebind.Setup{profile="REBIND2"} (хотя так получается неконсистентно как-то, ведь уже есть отдельная команда rebind.LoadBindings для загрузки "профиля" из файла)
IgorZ wrote: Имеющиеся в rebind функции тоже должны поддерживать профили.
Работают с текущим профилем, большего думаю и не потребуется.

Списка профилей нет, т.к. нет иерархии, профиль это произвольный ключ в общей базе. Пока. Если функциональность будет востребована (в чём я не уверен), то надо сделать.

Копирование профиля может и было бы полезно, но как по мне то для начала нужно средство визуализации содержимого базы, иначе неясно что вообще копируем.
Возможно это всё стоит возложить на скрипт http://forum.farmanager.com/viewtopic.php?f=60&t=10120
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:
IgorZ wrote: Разумеется, это всё программа-максимум, как я её вижу.
Давайте начнём с минимума.
Добавил возможность считывания ключа с произвольным именем через rebind.Setup{profile="REBIND2"} (хотя так получается неконсистентно как-то, ведь уже есть отдельная команда rebind.LoadBindings для загрузки "профиля" из файла)
Кстати, нелогично было: в файлах можно хранить разные профили, а в БД нельзя.
John Doe wrote:
IgorZ wrote: Имеющиеся в rebind функции тоже должны поддерживать профили.
Работают с текущим профилем, большего думаю и не потребуется.
Будем посмотреть.
John Doe wrote:Списка профилей нет, т.к. нет иерархии, профиль это произвольный ключ в общей базе. Пока. Если функциональность будет востребована (в чём я не уверен), то надо сделать.
В отсутствие списка удобство пользования хромает. Собственно, главная идея - переключаться с одного на другой на лету - превращается в что-то крайне малоудобное.
John Doe wrote:Копирование профиля может и было бы полезно, но как по мне то для начала нужно средство визуализации содержимого базы, иначе неясно что вообще копируем.
Возможно это всё стоит возложить на скрипт http://forum.farmanager.com/viewtopic.php?f=60&t=10120
А что визуализировать? Как абсолютный минимум, _KEY надо возвращать. Вставлю я, пожалуй, для начала

Code: Select all

  _URL=nfo.url,
  _KEY=_KEY,
  Setup=Setup,
Насчёт скрипта подумаю. Возможно, имеет смысл написать отдельный скрипт, а может, встроить в один из имеющихся.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

IgorZ wrote: В отсутствие списка удобство пользования хромает.
Разумеется. Но для предварительного теста должно быть достаточно.
IgorZ wrote: А что визуализировать?
Содержимое базы. Какие макросы и как переназначены.
IgorZ wrote: Как абсолютный минимум, _KEY надо возвращать
Верно. Но не так, а функцией. Или через метаметод.
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: А что визуализировать?
Содержимое базы. Какие макросы и как переназначены.
Это понятно. Я имел в виду, что в таком виде в принципе неясно, какой профиль активен и, соответственно, откуда выводить.
John Doe wrote:
IgorZ wrote: Как абсолютный минимум, _KEY надо возвращать
Верно. Но не так, а функцией. Или через метаметод.
Пока хотя бы так. Иначе даже не протестировать.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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

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

Post by John Doe »

IgorZ wrote: вставил маленький костыль в rebind
Обновил версию в шапке.
Помимо вашей строчки изменения в основном технические: Info для ScriptBrowser, переименованы/дооформлены вспомогательные файлы, добавлен макрос для вставки шаблона в bindings.
IgorZ wrote: Чтобы он заработал с уже имевщимся до костыля профилем, надо произвести любую манипуляцию с rebind
Или запустить из командной строки lua:mf.msave("REBIND","RebindProfile","REBIND")
Post Reply

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