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

Здесь обсуждается всё, что касается макросов.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

Latest post of the previous page:

John Doe wrote: Fri 07 Dec, 2018 09:54Вот так по-быстрому сделаете, а в другой раз час будете искать ошибку.

Красный тормоз он не зря вылазит.
Это очень ситуативно. Зачастую прямо сейчас времени в обрез, стресс, а в другой раз и несколько часов порожнего дежурства и тогда времени на поиски ошибки предостаточно.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Если хотите я могу вам вообще "красный тормоз" отключить, глобально.
Будете включать обратно только во время дежурства ;-)

Ну а если серьёзно, то ошибка затронет один файл, и срочности в её устранении в общем нет.
И как по мне, то пусть лучше она маячит перед глазами при загрузке макросов, чем забыть о ней совсем.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

По поводу проверки m.key: из двух предложенных мной вариантов sToLp выбрал первый, в котором данной проверки нет. Так что обсуждение данного вопроса неактуально. А вообще, все, казалось бы, избыточные проверки вставлялись мной с далеко идущей целью: в конечном итоге переопределять Macro в _macroinit.lua, чтобы не надо было переправлять Macro на MMacro. Тогда функции понадобится универсальность. Но в принятой sToLp редакции, как я уже заметил, есть только проверка на наличие и корректный тип поля key2.
Last edited by IgorZ on Fri 07 Dec, 2018 10:35, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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

Таким образом было бы удобно совмещать независимые функции, и чуть ли не на лету расширять возможности загрузчика макросов.
А разнообразных идей в какую сторону расширять уже немало было на форуме.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

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: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

John Doe wrote: Fri 07 Dec, 2018 10:18 Если хотите я могу вам вообще "красный тормоз" отключить, глобально.
С удовольствием ознакомился бы с тем, как это делается. Реализовывать то ведь это ни что не принуждает, а знать разные способы завсегда полезно.
как по мне, то пусть лучше она [ошибка] маячит перед глазами при загрузке макросов, чем забыть о ней совсем
И в большинстве случаев это так. Но, всё же, не в исключительном большинстве.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

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: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

IgorZ wrote: Fri 07 Dec, 2018 10:34переопределять Macro в _macroinit.lua, чтобы не надо было переправлять Macro на MMacro
Неужели это реально можно сделать? Вот было бы здорово!
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

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: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

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: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Причина проста: на момент вызова меню уже закрыто.
И немудрено, вы же там клавиши какие-то нажимаете.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

IgorZ,

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

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

Ещё раз благодарю Вас за этот полезный пример!
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

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: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

John Doe wrote: Fri 07 Dec, 2018 22:16 Причина проста: на момент вызова меню уже закрыто.
И немудрено, вы же там клавиши какие-то нажимаете.
Не всегда закрыто. Ошибка возникает, если последняя буква комбинации присутствует среди быстрых клавиш, назначенных LuaMacro. Тогда меню срабатывает сразу после Keys(k), иначе надо дополнительно жать Enter. Проверку вставить - и всё.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

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: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

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 - глобальные, определённые Вами где-то в другом файле? Если да, то, как минимум, требовалось явно указать, что данные макросы для корректной работы требуют другого файла, и приложить его или, хотя бы, ссылку на него, выложенного в другом месте. Если же нет, то это явная ошибка.
Действительно, существенный блок выпал. Спасибо, что указали! Исправлено.
Post Reply

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