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

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

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

Post by John Doe » Tue 01 Jul, 2014 10:36


Ниже предлагается простое централизованное решение, позволяющее отключить любой сторонний макрос, или переопределить его клавиатурную комбинацию.
Прототип обсуждался ранее, а теперь всё это можно делать интерактивно, с помощью одного из двух альтернативных макро браузеров:
  • 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 70 times

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

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

Post by IgorZ » Thu 04 Aug, 2016 11:12

Latest post of the previous page:

John Doe wrote:
IgorZ wrote: А что визуализировать?
Содержимое базы. Какие макросы и как переназначены.
Это понятно. Я имел в виду, что в таком виде в принципе неясно, какой профиль активен и, соответственно, откуда выводить.
John Doe wrote:
IgorZ wrote: Как абсолютный минимум, _KEY надо возвращать
Верно. Но не так, а функцией. Или через метаметод.
Пока хотя бы так. Иначе даже не протестировать.

User avatar
John Doe
Бюрократ
Posts: 11421
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Thu 04 Aug, 2016 11:49

IgorZ wrote: Пока хотя бы так. Иначе даже не протестировать.
Там всегда будет значение по умолчанию, которое мы и так знаем. Потому что вызов Setup изменит только внутреннюю переменную, а в таблице модуля останется прежнее неактуальное.
Поэтому должно быть что-то типа getCurProfile = function() return _KEY end

User avatar
John Doe
Бюрократ
Posts: 11421
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Thu 04 Aug, 2016 13:47

К выходу 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: 11421
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Thu 04 Aug, 2016 14:00

John Doe wrote:
IgorZ wrote:А что визуализировать?
Содержимое базы. Какие макросы и как переназначены.
Подумалось, что визуализировать базу переназначений можно экспортом в файл, с форматом описанным в шапке.

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

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

Post by IgorZ » Fri 05 Aug, 2016 08:54

John Doe wrote:Профиль из базы теперь считывается командой LoadBindings (profile,db)
Я так понимаю, вторым параметром надо обязательно указывать любое неложное значение. Надо бы, наверное, уточнить в шапке - не каждый с ходу поймёт.
John Doe wrote:Подумалось, что визуализировать базу переназначений можно экспортом в файл, с форматом описанным в шапке.
Через временный файл? Некрасиво. А заготовки в виде п/п вывода значения таблиц у меня уже давно есть. Чуть подшаманить под конкретную структуру - и готово.

User avatar
John Doe
Бюрократ
Posts: 11421
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Fri 05 Aug, 2016 09:17

IgorZ wrote: Через временный файл? Некрасиво.
Что некрасиво-то? А например меню пользователя в редакторе разве некрасиво править?

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

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

Post by IgorZ » Fri 05 Aug, 2016 11:40

John Doe wrote:
IgorZ wrote: Через временный файл? Некрасиво.
Что некрасиво-то? А например меню пользователя в редакторе разве некрасиво править?
Лишний промежуточный этап.
Впрочем, посмотрим. На выходных попробую набросать вчерне.

User avatar
John Doe
Бюрократ
Posts: 11421
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Fri 05 Aug, 2016 14:58

IgorZ wrote: Лишний промежуточный этап.
Заодно и средство правки, и готовый импорт/экспорт. И в коде всё есть для загрузки из файла.

User avatar
DrKnS
Posts: 4648
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 125 times
Contact:

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

Post by DrKnS » Fri 05 Aug, 2016 22:24

John Doe wrote:
IgorZ wrote: Через временный файл? Некрасиво.
Что некрасиво-то? А например меню пользователя в редакторе разве некрасиво править?
А где там временный файл?

User avatar
John Doe
Бюрократ
Posts: 11421
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Fri 05 Aug, 2016 22:29

far 1.75

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

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

Post by IgorZ » Mon 08 Aug, 2016 06:24

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

Сам скрипт. Пока только минимальная демонстрация возможностей: просмотр списка профилей и самих профилей, а также условная смена профиля. Можно запускать как файл, можно как макрос.
  1. -- Список профилей rebind
  2. -- Клавиша вызова AltShiftR
  3. -- Enter - смена профиля, F3 - просмотр профиля
  4. -- v0.0.1 -- старт
  5. local F,rb = far.Flags,package.loaded.rebind
  6. --
  7. local ReadDB,ShowMenu,ShowProfile -- функции
  8. --
  9. function ReadDB() --[[прочитать данные из БД]]
  10. --local tbl = {[package.loaded.rebind.getCurProfile()]={[0]=true}} -- таблица с данными
  11. local tbl = {} -- таблица с данными
  12. local obj = far.CreateSettings(nil,F.PSL_ROAMING) -- откроем глобальные данные
  13. local list = obj:Enum(0) -- список элементов корня
  14. for _,v in ipairs(list) do -- переберём все
  15.   if v.Type==F.FST_SUBKEY then -- подключ? проверим
  16.     local skey = obj:OpenSubkey(0,v.Name) -- получим его
  17.     if obj:Get(skey,"RebindProfile",F.FST_DATA) then -- найден признак профиля rebind?
  18.       local slist = obj:Enum(skey) -- список содержимого профиля
  19.       tbl[v.Name] = {} -- заготовим место под профиль
  20.       for _,vv in ipairs(slist) do -- переберём все
  21.         if vv.Name~="RebindProfile" then tbl[v.Name][vv.Name] = loadstring(obj:Get(skey,vv.Name,F.FST_DATA))() end -- не признак - запишем
  22.       end
  23.     end
  24.   end
  25. end
  26. obj:Free() -- закроем
  27. return tbl -- вернём данные
  28. end -- ReadDB
  29. --
  30. function ShowProfile(tbl,name)
  31. --LE(tbl,name)
  32. local fntbl = {} -- таблица, сгруппированная по файлам
  33. for n,v in pairs(tbl) do -- перпеберём все записи
  34.   if not fntbl[v.FileName] then fntbl[v.FileName] = {} end -- для впервые встречающегося файла добавим пустую таблицу под записи
  35.   fntbl[v.FileName][n] = {id=n,disabled = v.disabled,description=v.description,key=v.key} -- добавим запись
  36. end
  37. --LE(fntbl)
  38. local items = {} --строки вывода
  39. for n,v in pairs(fntbl) do -- переберём все файлы
  40.   items[#items+1] = {text = n,separator=true} -- запишем имя
  41.   for nn,vv in pairs(v) do -- переберём все записи для этого файла
  42.     items[#items+1] = {text = vv.description or "no description"} -- описание
  43.     items[#items+1] = {text = "       id: "..nn} -- id
  44.     if vv.key then items[#items+1] = {text = "  new key: "..vv.key} end -- изменённые клавиши, если есть
  45.     if vv.disabled then items[#items+1] = {text = "  disabled"} end -- признак отключения, если есть
  46.   end
  47. end
  48. far.Menu({Title='Rebind profile "'..name..'"',Flags=F.FMENU_SHOWAMPERSAND+F.FMENU_WRAPMODE},items) -- выведем
  49. end -- ShowProfile
  50. --
  51. function ShowMenu()
  52. --local Bottom,pos,res,HotKeys,DBChanged = "Enter, Esc, F1, F2, F3, F4, F5, F10, Ins, Del, CtrlPgUp, CtrlS",1 -- подсказка, позиция, результат, горячие клавиши
  53. --HotKeys = {{BreakKey="F1"},{BreakKey="F2"},{BreakKey="F3"},{BreakKey="F4"},{BreakKey="F5"},{BreakKey="F10"},
  54. --  {BreakKey="INSERT"},{BreakKey="NUMPAD0"},{BreakKey="DELETE"},{BreakKey="DECIMAL"},{BreakKey="C+PRIOR"},{BreakKey="C+NUMPAD9"},{BreakKey="C+S"}}
  55. local Bottom,HotKeys,pos,res = "Enter, Esc, F3",{{BreakKey="F3"}} -- подсказка, горячие клавиши, позиция, результат
  56. --
  57. repeat -- главный цикл
  58.   local tbl = ReadDB() -- прочитаем БД
  59.   local CurPrf = rb.getCurProfile() -- имя текущего профиля
  60.   local items = {{text=CurPrf,checked="*"}} -- инициализируем список профилей текущим
  61.   for n in pairs(tbl) do if n~=CurPrf then items[#items+1] = {text=n} end end -- сформируем заготовку меню
  62.   table.sort(items,function(a,b) return a.text<b.text end) -- отсортируем по типу и по имени
  63.   for i,v in ipairs(items) do if v.checked then pos = i break end end -- спозиционируемся на текущий профиль
  64.   res,pos = far.Menu({Title="Rebind profiles",Bottom=Bottom,SelectIndex=pos--[[,Id=Guids.Menu--]],
  65.     Flags=F.FMENU_SHOWAMPERSAND+F.FMENU_WRAPMODE},items,HotKeys) -- меню
  66.   if not res then return -- Esc - выход
  67.   elseif not res.BreakKey then -- Enter - смена профиля
  68.     if res.text~=CurPrf then far.Message([[
  69. Automate Rebind profile changing is not supported now.
  70. For changing open ']]..win.GetEnv("FARPROFILE")..[[\Macros\scripts\_macroinit.lua'
  71. and manualy replace "]]..CurPrf..[[" with "]]..res.text..[[" in "LoadBindings" call.]],"Change Rebind profile",";Ok","l")
  72.     else
  73.       far.Message([[Selected current Rebind profile "]]..CurPrf..[[".]],"Change Rebind profile",";Ok","l")
  74.     end
  75.     return
  76.   elseif res.BreakKey=="F3" then -- просмотр профиля?
  77.     ShowProfile(tbl[items[pos].text] or {},items[pos].text) -- покажем
  78.   end
  79. until false
  80. end -- ShowMenu
  81. --
  82. if not Macro then if rb then ShowMenu() end return end -- для запуска по Enter
  83. --
  84. Macro{
  85.   id="EA82B929-FDD0-4084-A240-B0F6199299F9";
  86.   area="Common";
  87.   key="AltShiftR";
  88.   description="Test rebind profiles";
  89.   condition=function() return not not rb end;
  90.   action=ShowMenu;
  91. }

User avatar
John Doe
Бюрократ
Posts: 11421
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Sun 28 Aug, 2016 17:52

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

User avatar
Dennis_Moore
Posts: 237
Joined: Tue 03 Mar, 2015 19:54
Location: Kiev
Has thanked: 5 times
Been thanked: 11 times

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

Post by Dennis_Moore » Sat 03 Jun, 2017 17:40

При наличии этого макроса - viewtopic.php?p=141180#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: 11421
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Mon 05 Jun, 2017 21:26

Там строка 63 закомментирована напрасно, по-видимому.
А ещё лучше наверно заменить её на if not filename then return mf.AddMacro(m) end

User avatar
Dennis_Moore
Posts: 237
Joined: Tue 03 Mar, 2015 19:54
Location: Kiev
Has thanked: 5 times
Been thanked: 11 times

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

Post by Dennis_Moore » Tue 06 Jun, 2017 13:48

John Doe wrote:
Mon 05 Jun, 2017 21:26
Там строка 63 закомментирована напрасно, по-видимому.
А ещё лучше наверно заменить её на if not filename then return mf.AddMacro(m) end
Заменил, починилось. Спасибо.

Post Reply

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