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

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

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 186 times
IgorZ
Posts: 709
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 68 times

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

Post by IgorZ »

Latest post of the previous page:

В силу вариативности будущего занялся тестированием только сейчас. Не знаю, насколько это ещё актуально, но вот предлагаемые исправления найденных ошибок:
  1. 55c55
  2. <   if Macro and Macro.id and m.id then
  3. ---
  4. >   if Macro and Macro.id then
  5. 66c66
  6. <   m.id = m.id or m.uid or auto_uids and MakeUid(filename,m.description)
  7. ---
  8. >   m.id = m.id or m.id or auto_uids and MakeUid(filename,m.description)
  9. 78c78
  10. <   if Event and Event.id and m.id then
  11. ---
  12. >   if Event and Event.id then
  13. 179c179
  14. <   local idx = usedUids[id:lower()]
  15. ---
  16. >   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" или ещё как-то в этом духе.
User avatar
John Doe
Бюрократ
Posts: 13062
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 41 times
Been thanked: 319 times

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

Post by John Doe »

Спасибо за вашу работу!
IgorZ wrote: Исправляет ошибки с повторяющимися id/uid; с id/uid, заданном с использованием верхнего регистра;
Исправил в тот же день, думал никто не успеет заметить)
IgorZ wrote: if Macro and Macro.id then
Тут должно быть if Macro and Macro.id and Macro.id~="<no id>" then
IgorZ wrote: при выборе "Cancel" сообщение из error не выводится на экран
Странно..
В "стабильной" я не проверял, т.к. смысла вообще нет, но если в актуальной версии повысить требуемый билд, то у меня ошибка нормально выводится
IgorZ wrote: К тому же (в любой версии) вставляемый в Event condition при редактировании всплывает вместо заданного, что вообще никуда не годится.
Увы, я не знаю другого способа динамически отключить событие.
Вариантов вижу два:
- запретить делать это динамически.
- написать на мантис пожелание чтобы поле disabled обрабатывалось luamacro и в обработчиках событий
(или иначе: обрабатывать priority=0 как запрет выполнения)

P.S.
diff лучше с ключом -u
IgorZ
Posts: 709
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 68 times

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

Post by IgorZ »

John Doe wrote:Спасибо за вашу работу!
Общее дело делаем! ;)
John Doe wrote: В "стабильной" я не проверял, т.к. смысла вообще нет, но если в актуальной версии повысить требуемый билд, то у меня ошибка нормально выводится
Сейчас проверил на версии 4743 - так же распаковал дистрибутив, указал UseSystemProfiles=0, в пустой профиль положил на нужные места rebind.lua с правленной требуемой версией и _macroinit.lua, вызывающий rebind. Тоже не выводится. Буду чесать затылок.
John Doe wrote: Вариантов вижу два:
- запретить делать это динамически.
- написать на мантис пожелание чтобы поле disabled обрабатывалось luamacro и в обработчиках событий
(или иначе: обрабатывать priority=0 как запрет выполнения)
В качестве костыля: ввести поле OriginalCondition и хранить там ссылку на него, чтоб можно было пользоваться.

P. S. Хотя
John Doe wrote:чтобы поле disabled обрабатывалось luamacro и в обработчиках событий
наиболее правильно, на мой взгляд.
John Doe wrote:diff лучше с ключом -u
Спасибо, я раньше не использовал diff.
Last edited by IgorZ on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Спрятан оверквотинг
User avatar
John Doe
Бюрократ
Posts: 13062
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 41 times
Been thanked: 319 times

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

Post by John Doe »

IgorZ wrote: В качестве костыля:
Да, действительно, исправил.
Будет добавляться поле original_condition

P.S.
Подумываю сделать 2 отдельных действия: 1. Отключить макро/евент временно (до перегрузки) 2. Отключить постоянно (с записью в базу)
User avatar
John Doe
Бюрократ
Posts: 13062
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 41 times
Been thanked: 319 times

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

Post by John Doe »

IgorZ wrote: Сейчас проверил на версии 4743 - так же распаковал дистрибутив, указал UseSystemProfiles=0, в пустой профиль положил на нужные места rebind.lua с правленной требуемой версией и _macroinit.lua, вызывающий rebind. Тоже не выводится. Буду чесать затылок.
Вот упрощёный кейс. Распаковать содержимое архива в папку %FARHOME%\ProfileTest.
Запустить Far.exe /s ProfileTest

И попробуйте ещё проще, поместить в scripts lua-скрипт с командой error "test"
IgorZ
Posts: 709
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 68 times

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

Post by IgorZ »

John Doe wrote:Будет добавляться поле original_condition
Отлично, буду править.
John Doe wrote:Подумываю сделать 2 отдельных действия: 1. Отключить макро/евент временно (до перегрузки) 2. Отключить постоянно (с записью в базу)
А так ли часто нужно временное отключение? Ведь обычно скрипт отключается либо для совершения какого-то действия, которому он мешает, либо для проверки, либо за ненадобностью. И в большинстве случаев перезагрузка не имеет отношения к условию окончания надобности в отключении скрипта. Возможно, я просто не вижу какого-то варианта, при котором временное отключение полезно?
John Doe wrote:И попробуйте ещё проще, поместить в scripts lua-скрипт с командой error "test"
Всё попробую. Только пока rebind+LuaManager актуальнее.

Скачал свежую версию. Одна ошибка осталась неисправленной:
  1. --- rebind.lua.original Fri Jul 29 08:33:52 2016
  2. +++ rebind.lua  Fri Jul 29 08:39:11 2016
  3. @@ -176,7 +176,7 @@
  4.  
  5.  local function GetMacroIdx(id)
  6.    assert(id,"macro id not specified")
  7. -  local idx = usedUids[id]
  8. +  local idx = usedUids[id:lower()]
  9.    return idx, not idx and "specified macro not found" or nil
  10.  end
MacroRebind/MacroDisable вызывают GetMacro, а тот GetMacroIdx, и, соответственно, id сюда может придти в любом виде, а в usedUids они все в lowercase.
IgorZ
Posts: 709
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 68 times

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

Post by IgorZ »

IgorZ wrote:
John Doe wrote:И попробуйте ещё проще, поместить в scripts lua-скрипт с командой error "test"
Всё попробую. Только пока rebind+LuaManager актуальнее.
Не вытерпел, решил посмотреть по-быстрому. Непонятная история.
В _macroinit.lua стояло local _,rebind = pcall(require,"rebind"). Поставил требуемую версию Far в 14743. Ошибка при перезагрузке не выводилась. Заменил вызов на rebind = require("rebind"). Заработало!!! Весь радостный возвращаю local _,rebind = pcall(require,"rebind") для окончательной проверки. Перезагружаю. Ошибка выводится! Закрываю Far, запускаю снова - всё равно выводится. И что это было???
User avatar
John Doe
Бюрократ
Posts: 13062
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 41 times
Been thanked: 319 times

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

Post by John Doe »

IgorZ wrote: А так ли часто нужно временное отключение?
Дело в том, что "временное" отключение внутри rebind уже есть (и было изначально).
Ведь любая перезагрузка макросов "убивает" текущее состояние, что нежелательно.
Поэтому даже когда я хочу отключить макрос/событие "постоянно", всё равно предпочтительнее не перегружать макросы сразу, а отключить их в текущей сессии "временным" способом, что сейчас и делается.
IgorZ wrote:Ведь обычно скрипт отключается либо для совершения какого-то действия, которому он мешает, либо для проверки, либо за ненадобностью.
Для двух из трёх перечисленных вами действий удобнее именно "временное" отключение.
IgorZ wrote: Одна ошибка осталась неисправленной:
Спасибо, исправил и эту.
IgorZ
Posts: 709
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 68 times

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

Post by IgorZ »

John Doe wrote:
IgorZ wrote: А так ли часто нужно временное отключение?
Дело в том, что "временное" отключение внутри rebind уже есть (и было изначально).
Ведь любая перезагрузка макросов "убивает" текущее состояние, что нежелательно.
Поэтому даже когда я хочу отключить макрос/событие "постоянно", всё равно предпочтительнее не перегружать макросы сразу, а отключить их в текущей сессии "временным" способом, что сейчас и делается.
Да это понятно. вопрос в целесообразности.
John Doe wrote:
IgorZ wrote:Ведь обычно скрипт отключается либо для совершения какого-то действия, которому он мешает, либо для проверки, либо за ненадобностью.
Для двух из трёх перечисленных вами действий удобнее именно "временное" отключение.
Они (1 и 2) временные по своей сути. Но к перезагрузке такие отключения, как правило, ничем не привязаны. Просто её в большинстве случаев можно использовать для сброса состояния, только и всего. В общем, вреда от внедрения аременных отключений я не вижу, но и пользы ощутимой тоже.
John Doe wrote:
IgorZ wrote: Одна ошибка осталась неисправленной:
Спасибо, исправил и эту.
Скачал, спасибо. Кстати, нет желания привязать _NAME и _KEY к реальному имени файла? Это дало бы забавные возможности в части управления переназначениями клавиш. В частности, одним движением переключать группы переназначений.
User avatar
John Doe
Бюрократ
Posts: 13062
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 41 times
Been thanked: 319 times

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

Post by John Doe »

IgorZ wrote: В общем, вреда от внедрения аременных отключений я не вижу, но и пользы ощутимой тоже.
Будет два разных действия, которые можно повесить на разные шорткаты.
А там уж каждый сможет выбрать то действие, которое ему полезно.
IgorZ wrote: Кстати, нет желания привязать _NAME и _KEY к реальному имени файла? Это дало бы забавные возможности в части управления переназначениями клавиш. В частности, одним движением переключать группы переназначений.
Не уверен что понял.
Вы хотите переименованием модуля добиваться того что настройки будут читаться из другого ключа?
Так не годится, ведь макробраузеры привязаны к имени модуля.
Но задание ключа легко вынести в setup
IgorZ
Posts: 709
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 68 times

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

Post by IgorZ »

John Doe wrote:
IgorZ wrote: В общем, вреда от внедрения аременных отключений я не вижу, но и пользы ощутимой тоже.
Будет два разных действия, которые можно повесить на разные шорткаты.
А там уж каждый сможет выбрать то действие, которое ему полезно.
В общем, будет - поддержку сделаю. Не будет - не огорчусь.
John Doe wrote:
IgorZ wrote: Кстати, нет желания привязать _NAME и _KEY к реальному имени файла? Это дало бы забавные возможности в части управления переназначениями клавиш. В частности, одним движением переключать группы переназначений.
Не уверен что понял.
Вы хотите переименованием модуля добиваться того что настройки будут читаться из другого ключа?
Так не годится, ведь макробраузеры привязаны к имени модуля.
Но задание ключа легко вынести в setup
Да, макробраузер в таком варианте поддерживать не сможет. Но возможность управлять не единичными скриптами, а целыми группами путём отключения одного модуля, включения другого и перезагрузки скриптов останется. Это дало бы возможность быстро, довольно легко и с минимальными затратами в rebind перенастраивать рабочую среду целиком. Допустим, один набор настроек для программирования в Lua, другой - для набора и редактирования текстов, третий для каких-то ещё нужд. Но если встроить в rebind полную поддержку наборов конфигураций, было бы ещё удобнее.

P. S. Когда примерно ждать официального релиза?
User avatar
John Doe
Бюрократ
Posts: 13062
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 41 times
Been thanked: 319 times

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

Post by John Doe »

IgorZ wrote: Но если встроить в rebind полную поддержку наборов конфигураций, было бы ещё удобнее.
Так это всего пара строк кода, в простейшем случае.
Но лучше опишите как вы видите.
IgorZ wrote: Когда примерно ждать официального релиза?
Как отмашку дадите, что всё желаемое работает)
Т.е. хоть сейчас.

Потому что в данный момент я занимаюсь другим: http://forum.farmanager.com/viewtopic.p ... 66#p121966
IgorZ
Posts: 709
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 68 times

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

Post by IgorZ »

John Doe wrote:
IgorZ wrote: Но если встроить в rebind полную поддержку наборов конфигураций, было бы ещё удобнее.
Так это всего пара строк кода, в простейшем случае.
Но лучше опишите как вы видите.
С точки зрения пользователя? В идеальном случае это должно выглядеть так:
У меня есть рабочая конфигурация (лучше назовём это профилем) rebind. Для (условно) работы с новым проектом мне нужно, чтобы по имеющимся привычным комбинациям клавиш отрабатывали другие макросы (к примеру, при сохранении файла делались некие специфические действия), часть эвентов мне будут мешать, но нужно подключить новые. Я вызываю меню настройки профилей rebind, копирую текущий (допустим, "Lua proger") с новым именем (пусть, "проект на заказ"), активирую новый и перенастраиваю, как мне надо. После этого я, начав работу с проектом, активирую профиль "проект на заказ", а, сев писать новый Lua скрипт, переключаюсь на "Lua proger". Само переключение делается вызовом меню и выбором нужного пункта или по горячей клавише (не уверен, какой вариант лучше; склоняюсь больше к меню).
С точки зрения программиста желательны функции создания нового профиля (пустого), копирования существующего (не обязательна, можно самому создать пустой, прочитать существующий и записать это в пустой), переименования (в принципе, тоже можно симулировать вручную), удаления, получения списка существующих, чтения/записи существующего профиля, выбора активного. Имеющиеся в rebind функции тоже должны поддерживать профили. Для любой функции, если имя профиля не указано, берётся текущий. Ну и программная структура, описывающая содержание профиля, должна поддерживать возможность расширения без ломки существующего(скажем, если в rebind добавится поддержка MenuItem или CommandLine). И пользовательские поля в профиле были бы удобны (я бы, к примеру, возможно, сделал привязку к профилю включения/отключения некоторых модулей).
Разумеется, это всё программа-максимум, как я её вижу.
John Doe wrote:
IgorZ wrote: Когда примерно ждать официального релиза?
Как отмашку дадите, что всё желаемое работает)
Т.е. хоть сейчас.
Если существенных изменений по сравнению с последней тестовой версией не было, то, думаю, хоть сейчас. А я ещё чуть потестирую и (завтра, скорее всего) выложу новый LuaManager.
John Doe wrote:Потому что в данный момент я занимаюсь другим: http://forum.farmanager.com/viewtopic.p ... 66#p121966
Интересно. Буду ждать результатов. Готов поучаствовать по мере возможности и необходимости.
User avatar
John Doe
Бюрократ
Posts: 13062
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 41 times
Been thanked: 319 times

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

Post by John Doe »

IgorZ wrote: Если существенных изменений по сравнению с последней тестовой версией не было, то, думаю, хоть сейчас.
Изменений 0.
Вообще с момента публикации первой версии никаких изменений не было: я ещё 2 года назад начал переписывать его, но застрял на вопросах интерфейса, и так и не доделал ничего.

"Тестовая" же версия базируется на изначальной, с незначительными изменениями, которые мы с вами уже обсуждали.
IgorZ wrote: Интересно. Буду ждать результатов. Готов поучаствовать по мере возможности и необходимости.
В ближайшее время выложу, всё работает, добавлю только для приличия пару функций в демонстрационный браузер скриптов.
Кстати, в начале исходника rebind уже можно увидеть как это выглядит.
IgorZ
Posts: 709
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 68 times

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

Post by IgorZ »

John Doe wrote:
IgorZ wrote: Интересно. Буду ждать результатов. Готов поучаствовать по мере возможности и необходимости.
В ближайшее время выложу, всё работает, добавлю только для приличия пару функций в демонстрационный браузер скриптов.
Кстати, в начале исходника rebind уже можно увидеть как это выглядит.
Я правильно понимаю, что nfo будет содержаться только в одном файле из всего пакета? Тогда я бы добавил таблицу-список файлов, входящих в пакет, если ещё нет. И неплохо бы указывать тип (как минимум) для каждого файла в списке: module/macro/event/menuitem/commandline/mixed (для смешанного содержимого)/config/lng/help. Или вместо "mixed" перечислять все имеющиеся в файле типы содержимого. И добавил поле имени всего пакета, если name - не оно. И, может быть, предусмотреть использование системных и предопределённых переменных (скажем, %packetname%, тогда можно указывать имена файлов через имя пакета: для LuaManager - %packetname%.lua,%packetname%Rus.lng,%packetname%Eng.lng,%packetname%Rus.hlf,%packetname%Eng.hlf. Да, и указывать главный файл (или считать главным тот, который содержит nfo?).
User avatar
John Doe
Бюрократ
Posts: 13062
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 41 times
Been thanked: 319 times

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

Post by John Doe »

Будет немного проще. Обсудим по факту.
Post Reply

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