Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

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

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by John Doe » Fri 07 Dec, 2018 11:26

Latest post of the previous page:

IgorZ wrote:
Fri 07 Dec, 2018 10:34
Тогда функции понадобится универсальность.
Верно, тогда понадобилась бы.
В своё время планировал переделать модуль rebind, выделив из него части, которые отвечают собственно за переопределение, а сами переопределяемые функции сделать суб-модулями, предусмотрев возможность каскадного их вызова.

Таким образом было бы удобно совмещать независимые функции, и чуть ли не на лету расширять возможности загрузчика макросов.
А разнообразных идей в какую сторону расширять уже немало было на форуме.

User avatar
sToLp
Posts: 926
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 106 times
Been thanked: 8 times

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by sToLp » Fri 07 Dec, 2018 11:32

IgorZ wrote:
Fri 07 Dec, 2018 06:23
Небольшое сервисное дополнение.
Данный макрос позволяет нажимать в меню выбора вторую быструю клавишу, не отпуская модификаторы.

Огромное спасибо за очередной подарок! Пытаюсь приспособить его к своим макросам.

И когда с данным установленным макросом после вызова меню, изображённого на выше приведённой картинке, на отмеченной позиции нажимаю Enter, 8 или S, то сразу же вызывается меню плагина. А когда нажимаю на AltShiftS, то меню тоже вызывается, но прежде появляется красная ошибка:
LuaMacro

...ндыВменюВыбораМакроса(IgorZ)men.lua:15: attempt to index field 'Value' (a nil value)
Stack Traceback
а строка 15 это:

Code: Select all

if Menu.Value:match(mod..k.."$") then
Тоже происходит и в других меню выбора макроса после попытки нажать шорткат, указанный в правой колонке меню.
Last edited by sToLp on Fri 07 Dec, 2018 11:36, edited 1 time in total.

User avatar
sToLp
Posts: 926
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 106 times
Been thanked: 8 times

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by sToLp » Fri 07 Dec, 2018 11:50

John Doe wrote:
Fri 07 Dec, 2018 10:18
Если хотите я могу вам вообще "красный тормоз" отключить, глобально.
С удовольствием ознакомился бы с тем, как это делается. Реализовывать то ведь это ни что не принуждает, а знать разные способы завсегда полезно.
как по мне, то пусть лучше она [ошибка] маячит перед глазами при загрузке макросов, чем забыть о ней совсем
И в большинстве случаев это так. Но, всё же, не в исключительном большинстве.

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

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by IgorZ » Fri 07 Dec, 2018 11:54

sToLp wrote:
Fri 07 Dec, 2018 11:32
И когда с данным установленным макросом после вызова меню, изображённого на выше приведённой картинке, на отмеченной позиции нажимаю Enter, 8 или S, то сразу же вызывается меню плагина. А когда нажимаю на AltShiftS, то меню тоже вызывается, но прежде появляется красная ошибка:
LuaMacro

...ндыВменюВыбораМакроса(IgorZ)men.lua:15: attempt to index field 'Value' (a nil value)
Stack Traceback
а строка 15 это:

Code: Select all

if Menu.Value:match(mod..k.."$") then
Тоже происходит и в других меню выбора макроса после попытки нажать шорткат, указанный в правой колонке меню.
Очень странно. Курсор стоит, как и на картинке? Тогда Menu.Value однозначно должно содержать значение текущей строки.
Единственное, что могу предположить - пересечение с ещё каким-то макросом. Хотя - приоритет 100 не должен давать...

User avatar
sToLp
Posts: 926
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 106 times
Been thanked: 8 times

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by sToLp » Fri 07 Dec, 2018 11:54

IgorZ wrote:
Fri 07 Dec, 2018 10:34
переопределять Macro в _macroinit.lua, чтобы не надо было переправлять Macro на MMacro
Неужели это реально можно сделать? Вот было бы здорово!

User avatar
sToLp
Posts: 926
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 106 times
Been thanked: 8 times

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by sToLp » Fri 07 Dec, 2018 12:09

IgorZ,

Чтобы полностью исключить влияние других макросов, оставил в Far`е только 2 файла с макросами. И ошибка несколько поменяла содержание:
LuaMacro

...ндыВменюВыбораМакроса(IgorZ)men.lua:15: attempt to index field
'Value' (a nil value)
stack traceback:
...ндыВменюВыбораМакроса(IgorZ)men.lua: in function <...
ндыВменюВыбораМакроса(IgorZ)men.lua:13>
А строка 13 это: action=function()
Last edited by sToLp on Fri 07 Dec, 2018 12:11, edited 1 time in total.

User avatar
sToLp
Posts: 926
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 106 times
Been thanked: 8 times

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by sToLp » Fri 07 Dec, 2018 22:05

IgorZ,

На текущий момент на основе Вашего примера сделал так:

Code: Select all

local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B" -- гуид меню выбора макроса
local k

Macro{
  description="В меню выбора макроса запустить выборочную позицию обозначенным шорткатом (по IgorZ) [multi]";
  -- IgorZ Fri 07 Dec 2018 06:23 https://forum.farmanager.com/viewtopic.php?p=152010#p152010
  id="9831AACE-C689-491B-A828-4C02D1E4208B";
  area="Menu";
  key="/^(?!.$|AltF4|Up|Down|Left|Right|CtrlLeft|CtrlRight|Home|End|Enter|Esc|CtrlIns|CtrlC).+/";
  -- ряд клавиш и сочетаний исключаются из применяющихся в макросе как сервисные для меню выбора макроса
  -- за пример регекспа особая благодарность shmuz`у (Шмуэлю)
  -- 01:53 26-06-2015 http://forum.ru-board.com/topic.cgi?forum=5&topic=31718&start=6900#14
  priority=100;
  condition=function(key)
    k = key:match("(.)$") -- завершающая клавиша шортката или одиночный хоткей
    return Menu.Id==MSMenuGuid -- макрос работает только в меню выбора макроса
  end;
  action=function()
    if Menu.Select(k,2)>0 then --msgbox("В меню нажат(ы) неки(й/е) модификатор(ы) и одиночная клавиша:",k,0x00010000)
      Keys(k)
    else
      Keys("AKey")
    end
  end;
}
Макросы можно активировать как точными сочетаниями, указываемыми в правом столбце меню выбора макроса, так и сочетаниями указанных завершающих клавиш с любыми другими модификаторами. Такая универсальность сделана потому, что в правом столбце меню могут быть не только однообразные сочетания клавиш с одними и теми же модификаторами, но и весьма разношёрстные по составу модификаторов. И только практика покажет насколько такой приём полезен.

В приводимом мною в теме примере так совпало, что запускающие сочетания в нём практически однообразные. Но пусть это не служит заблуждением, что однообразие модификаторов в ключах это правило для группирования макросов. Вовсе нет.


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

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by John Doe » Fri 07 Dec, 2018 22:16

Причина проста: на момент вызова меню уже закрыто.
И немудрено, вы же там клавиши какие-то нажимаете.

User avatar
sToLp
Posts: 926
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 106 times
Been thanked: 8 times

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by sToLp » Sat 08 Dec, 2018 10:44

IgorZ,

Спасибо John Doe за подсказку!

Благодаря ей, я осознал, что если в Вашем в строке if Menu.Value:match(mod..k.."$") then перед Menu.Value добавить позиционирование типа Menu.Select(k,2)>0 and, то вышеупомянутая красная ошибка выводиться не будет, и макрос отработает как первоначально задумано.

Ещё раз благодарю Вас за этот полезный пример!

User avatar
sToLp
Posts: 926
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 106 times
Been thanked: 8 times

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by sToLp » Sun 09 Dec, 2018 10:50

IgorZ,

Поупражнявшись с вариациями макросов, составленных на основе любезно предоставленного Вами , на текущий момент остановился пока всё-таки на варианте сабжевого макроса:

Code: Select all

local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B" --гуид меню выбора макроса
local mod,k

Macro{
  area="Menu"; priority=100; id="E741AACD-6A05-4224-8788-769676FBEBE0";
  description="активировать выборочную позицию меню выбора макроса обозначенным в ней ключом (поIgorZ) [multi]";
  --IgorZ Fri 07 Dec 2018 06:23 https://forum.farmanager.com/viewtopic.php?p=152010#p152010
  key="/^(?!.$|AltF4|Up|Down|Left|Right|CtrlLeft|CtrlRight|Home|End|Enter|Esc|CtrlIns|CtrlC).+/";
  --пример регекспа: shmuz 01:53 26-06-2015 http://forum.ru-board.com/topic.cgi?forum=5&topic=31718&start=6900#14
  condition=function(key)
    mod,k = key:match("^(.+)(.)$")
    return Menu.Id==MSMenuGuid
  end;
  action=function()
    if Menu.Select(mod..k,2)>0 then
      Keys("Enter")
    else
      Keys("AKey")
    end
  end;
}

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

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by IgorZ » Mon 10 Dec, 2018 05:33

John Doe wrote:
Fri 07 Dec, 2018 22:16
Причина проста: на момент вызова меню уже закрыто.
И немудрено, вы же там клавиши какие-то нажимаете.
Не всегда закрыто. Ошибка возникает, если последняя буква комбинации присутствует среди быстрых клавиш, назначенных LuaMacro. Тогда меню срабатывает сразу после Keys(k), иначе надо дополнительно жать Enter. Проверку вставить - и всё.

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

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by IgorZ » Mon 10 Dec, 2018 06:06

sToLp wrote:
Sun 09 Dec, 2018 10:50
IgorZ,

Поупражнявшись с вариациями макросов, составленных на основе любезно предоставленного Вами , на текущий момент остановился пока всё-таки на варианте сабжевого макроса:

Code: Select all

local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B" --гуид меню выбора макроса
local mod,k

Macro{
  area="Menu"; priority=100; id="E741AACD-6A05-4224-8788-769676FBEBE0";
  description="активировать выборочную позицию меню выбора макроса обозначенным в ней ключом (поIgorZ) [multi]";
  --IgorZ Fri 07 Dec 2018 06:23 https://forum.farmanager.com/viewtopic.php?p=152010#p152010
  key="/^(?!.$|AltF4|Up|Down|Left|Right|CtrlLeft|CtrlRight|Home|End|Enter|Esc|CtrlIns|CtrlC).+/";
  --пример регекспа: shmuz 01:53 26-06-2015 http://forum.ru-board.com/topic.cgi?forum=5&topic=31718&start=6900#14
  condition=function(key)
    mod,k = key:match("^(.+)(.)$")
    return Menu.Id==MSMenuGuid
  end;
  action=function()
    if Menu.Select(mod..k,2)>0 then
      Keys("Enter")
    else
      Keys("AKey")
    end
  end;
}
Для начала: такой замороченный key не нужен. Назначение макроса строго конкретное: реагировать на нажатие комбинации, состоящей из модификатора, заданного первичной комбинацией, и буквы. Проверить соответствие модификатора можно только динамически, и это делается в condition, поэтому отсекание служебных клавиш абсолютно излишне (кроме, разве что, CtrlC, но если эта комбинация входит в список вторичных, то лучше её не игнорировать, а если не входит, то и так отработет стандартный вариант). Разумеется, если не выбрасывать из condition проверку, как это сделали Вы.
По поводу action, мой вариант исправляется просто: соответствующая строка заменяется на

Code: Select all

if Menu and Menu.Value and Menu.Value:match(mod..k.."$") then
С другой стороны, Ваш вариант имеет свои достоинства. Какой лучше - с ходу не скажу.
И наконец: для тестирования я использую выложенный Вами lfsearch_e ({S поискИзаменаВредакторе[lfsearch](smuel)(сАвтовыводомКлючейПоJD)pluEdi.lua. В ходе последних проверок наткнулся на две ошибки в строках

Code: Select all

 local f,l,y,x,p,n,s = GInfo()
и

Code: Select all

      local f=GetFileName(l)
Функции GInfo и GetFileName - глобальные, определённые Вами где-то в другом файле? Если да, то, как минимум, требовалось явно указать, что данные макросы для корректной работы требуют другого файла, и приложить его или, хотя бы, ссылку на него, выложенного в другом месте. Если же нет, то это явная ошибка.

User avatar
sToLp
Posts: 926
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 106 times
Been thanked: 8 times

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by sToLp » Mon 10 Dec, 2018 15:49

IgorZ wrote:
Mon 10 Dec, 2018 06:06
для тестирования я использую выложенный Вами lfsearch_e ({S поискИзаменаВредакторе[lfsearch](smuel)(сАвтовыводомКлючейПоJD)pluEdi.lua. В ходе последних проверок наткнулся на две ошибки в строках

Code: Select all

 local f,l,y,x,p,n,s = GInfo()
и

Code: Select all

local f=GetFileName(l)
Функции GInfo и GetFileName - глобальные, определённые Вами где-то в другом файле? Если да, то, как минимум, требовалось явно указать, что данные макросы для корректной работы требуют другого файла, и приложить его или, хотя бы, ссылку на него, выложенного в другом месте. Если же нет, то это явная ошибка.
Действительно, существенный блок выпал. Спасибо, что указали! Исправлено.

User avatar
sToLp
Posts: 926
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 106 times
Been thanked: 8 times

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by sToLp » Mon 10 Dec, 2018 17:10

IgorZ,

Многословный существенный .

User avatar
sToLp
Posts: 926
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 106 times
Been thanked: 8 times

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by sToLp » Mon 10 Dec, 2018 17:16

IgorZ wrote:
Mon 10 Dec, 2018 06:06
По поводу action, мой вариант исправляется просто: соответствующая строка заменяется на

Code: Select all

if Menu and Menu.Value and Menu.Value:match(mod..k.."$") then
Очень хорошо! Спасибо за разъяснение! Подозреваю, что, вероятнее всего, этот способ также пригодится в этой или изменённой форме.

User avatar
sToLp
Posts: 926
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 106 times
Been thanked: 8 times

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by sToLp » Mon 10 Dec, 2018 18:12

IgorZ wrote:
Mon 10 Dec, 2018 06:06
С другой стороны, Ваш вариант имеет свои достоинства. Какой лучше — с ходу не скажу.
Полагаю, что целесообразнее сравнивать не варианты приведённого Вами примера между собой. А оба их с исходным сабжевым макросом. На текущий момент у меня получились следующие результаты.

а) Об ограниченности действия приведённого Вами примера в его первоначальном виде я многословно писал чуть выше.

б) Его видоизменённый мною вариант почему-то не активирует макрос, если ему назначен ключ типа AltF3.

в) Сабжевый макрос оказался не отточен на случаи, когда более короткий ключ стоит в позиции ниже более длинного ключа, в который значение короткого входит в качестве составляющей. Например:
utrir.png
если в данном утрированном меню нажать на F3, то активирована будет позиция с ключом AltF3, поскольку он находится выше по списку.

upd: проблема в) решается тем, что в соответствующих местах макроса сопоставление указаний ключей в строках меню выбора макроса следует вести не с сугубо нажатым ключом, а с ключом, предваряемым одним пробелом:
mf.substr(Menu.Value,-k:len(),k:len())==" "..k
и
Menu.Select(mf.string(" "..k), 2, 0) > 0
Attachments
~ [multi] запускВыборочнойКомандыВменюВыбораМакросаИдр[вариант2018_12_10](sToLp)men.lua.7z
(1.84 KiB) Downloaded 6 times
F 3_utrir.lua.7z
(2.97 KiB) Downloaded 6 times
Last edited by sToLp on Mon 10 Dec, 2018 22:13, edited 1 time in total.

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

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Post by IgorZ » Tue 11 Dec, 2018 05:54

sToLp wrote:
Mon 10 Dec, 2018 17:10
IgorZ,

Многословный существенный .
Универсальность - это хорошо. Но в данном случае, по моему мнению, она не нужна. Поскольку комбинация из двух клавиатурных комбинаций, в которой вторая имеет не те же модификаторы, что и первая, теряет главное преимущество: удобство и скорость последовательного нажатия. В этом случае после первого нажатия приходится отпускать клавиши-модификаторы, и в результате нажатие одной только быстрой клавиши удобнее, чем вместе с модификатором. Иначе говоря, CtrlK CtrlF удобно, CtrlK F менее удобно, но CtrlK AltF совершенно неудобно.
Возможно, предлагаемый Вами подход был оправдан, когда вторая клавиатурная комбинация тоже находилась в key, из-за её попадания в число активных, но после вынесения в key2 она вообще перестаёт существовать для LuaMacro вне конкретного локального меню, что предоставляет полную свободу для выбора удобных вариантов. И наиболее удобными являются те, в которых префиксы первой и второй комбинаций совпадают.
Кстати, ранее Вы действовали, исходя именно из этих соображений (выделил жирным):
sToLp wrote:
Tue 04 Dec, 2018 10:25
John Doe wrote:
Mon 03 Dec, 2018 22:03
возможно для автора ценность не в запуске последовательностями
По моему убеждению, основная ценность — в целокупности, в неразрывной и желательно гармоничной связи с тем, что происходит за пределами непосредственно самого меню выбора макроса, как я попытался изложить это выше.
И вопрос, какими именно последовательностями осуществлять запуск макросов из данного меню, к этому также всецело относится как существенный момент. А поскольку Вы верно указали на противоречия в ключах приведённого примера, то я в файле поменял CtrlShiftE на AltShiftV и CtrlShiftW на AltShiftO, и посмотрю, как это скажется на дееспособности данных макросов практически.

Post Reply

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