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
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 »

Latest post of the previous page:

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

P.S.
Подумываю сделать 2 отдельных действия: 1. Отключить макро/евент временно (до перегрузки) 2. Отключить постоянно (с записью в базу)
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: Сейчас проверил на версии 4743 - так же распаковал дистрибутив, указал UseSystemProfiles=0, в пустой профиль положил на нужные места rebind.lua с правленной требуемой версией и _macroinit.lua, вызывающий rebind. Тоже не выводится. Буду чесать затылок.
Вот упрощёный кейс. Распаковать содержимое архива в папку %FARHOME%\ProfileTest.
Запустить Far.exe /s ProfileTest

И попробуйте ещё проще, поместить в scripts lua-скрипт с командой error "test"
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:Будет добавляться поле 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.  
  3. +++ rebind.lua  Fri Jul 29 08:39:11 2016
  4.  
  5. @@ -176,7 +176,7 @@
  6.  
  7.  
  8.  
  9.  local function GetMacroIdx(id)
  10.  
  11.    assert(id,"macro id not specified")
  12.  
  13. -  local idx = usedUids[id]
  14.  
  15. +  local idx = usedUids[id:lower()]
  16.  
  17.    return idx, not idx and "specified macro not found" or nil
  18.  
  19.  end
MacroRebind/MacroDisable вызывают GetMacro, а тот GetMacroIdx, и, соответственно, id сюда может придти в любом виде, а в usedUids они все в lowercase.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 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: 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 уже есть (и было изначально).
Ведь любая перезагрузка макросов "убивает" текущее состояние, что нежелательно.
Поэтому даже когда я хочу отключить макрос/событие "постоянно", всё равно предпочтительнее не перегружать макросы сразу, а отключить их в текущей сессии "временным" способом, что сейчас и делается.
IgorZ 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:
IgorZ wrote: А так ли часто нужно временное отключение?
Дело в том, что "временное" отключение внутри rebind уже есть (и было изначально).
Ведь любая перезагрузка макросов "убивает" текущее состояние, что нежелательно.
Поэтому даже когда я хочу отключить макрос/событие "постоянно", всё равно предпочтительнее не перегружать макросы сразу, а отключить их в текущей сессии "временным" способом, что сейчас и делается.
Да это понятно. вопрос в целесообразности.
John Doe wrote:
IgorZ wrote:Ведь обычно скрипт отключается либо для совершения какого-то действия, которому он мешает, либо для проверки, либо за ненадобностью.
Для двух из трёх перечисленных вами действий удобнее именно "временное" отключение.
Они (1 и 2) временные по своей сути. Но к перезагрузке такие отключения, как правило, ничем не привязаны. Просто её в большинстве случаев можно использовать для сброса состояния, только и всего. В общем, вреда от внедрения аременных отключений я не вижу, но и пользы ощутимой тоже.
John Doe wrote:
IgorZ wrote: Одна ошибка осталась неисправленной:
Спасибо, исправил и эту.
Скачал, спасибо. Кстати, нет желания привязать _NAME и _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: В общем, вреда от внедрения аременных отключений я не вижу, но и пользы ощутимой тоже.
Будет два разных действия, которые можно повесить на разные шорткаты.
А там уж каждый сможет выбрать то действие, которое ему полезно.
IgorZ wrote: Кстати, нет желания привязать _NAME и _KEY к реальному имени файла? Это дало бы забавные возможности в части управления переназначениями клавиш. В частности, одним движением переключать группы переназначений.
Не уверен что понял.
Вы хотите переименованием модуля добиваться того что настройки будут читаться из другого ключа?
Так не годится, ведь макробраузеры привязаны к имени модуля.
Но задание ключа легко вынести в setup
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: Кстати, нет желания привязать _NAME и _KEY к реальному имени файла? Это дало бы забавные возможности в части управления переназначениями клавиш. В частности, одним движением переключать группы переназначений.
Не уверен что понял.
Вы хотите переименованием модуля добиваться того что настройки будут читаться из другого ключа?
Так не годится, ведь макробраузеры привязаны к имени модуля.
Но задание ключа легко вынести в setup
Да, макробраузер в таком варианте поддерживать не сможет. Но возможность управлять не единичными скриптами, а целыми группами путём отключения одного модуля, включения другого и перезагрузки скриптов останется. Это дало бы возможность быстро, довольно легко и с минимальными затратами в rebind перенастраивать рабочую среду целиком. Допустим, один набор настроек для программирования в Lua, другой - для набора и редактирования текстов, третий для каких-то ещё нужд. Но если встроить в rebind полную поддержку наборов конфигураций, было бы ещё удобнее.

P. S. Когда примерно ждать официального релиза?
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 полную поддержку наборов конфигураций, было бы ещё удобнее.
Так это всего пара строк кода, в простейшем случае.
Но лучше опишите как вы видите.
IgorZ wrote: Когда примерно ждать официального релиза?
Как отмашку дадите, что всё желаемое работает)
Т.е. хоть сейчас.

Потому что в данный момент я занимаюсь другим: http://forum.farmanager.com/viewtopic.p ... 66#p121966
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: Но если встроить в 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: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

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

"Тестовая" же версия базируется на изначальной, с незначительными изменениями, которые мы с вами уже обсуждали.
IgorZ wrote: Интересно. Буду ждать результатов. Готов поучаствовать по мере возможности и необходимости.
В ближайшее время выложу, всё работает, добавлю только для приличия пару функций в демонстрационный браузер скриптов.
Кстати, в начале исходника rebind уже можно увидеть как это выглядит.
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: Интересно. Буду ждать результатов. Готов поучаствовать по мере возможности и необходимости.
В ближайшее время выложу, всё работает, добавлю только для приличия пару функций в демонстрационный браузер скриптов.
Кстати, в начале исходника 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: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Будет немного проще. Обсудим по факту.
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.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: 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 wrote: А что визуализировать?
Содержимое базы. Какие макросы и как переназначены.
IgorZ wrote: Как абсолютный минимум, _KEY надо возвращать
Верно. Но не так, а функцией. Или через метаметод.
Post Reply

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