IgorZ wrote: ↑Fri 07 Dec, 2018 10:34
Тогда функции понадобится универсальность.
Верно, тогда понадобилась бы.
В своё время планировал переделать модуль rebind, выделив из него части, которые отвечают собственно за переопределение, а сами переопределяемые функции сделать суб-модулями, предусмотрев возможность каскадного их вызова.
Таким образом было бы удобно совмещать независимые функции, и чуть ли не на лету расширять возможности загрузчика макросов.
А разнообразных идей в какую сторону расширять уже немало было на форуме.
IgorZ wrote: ↑Fri 07 Dec, 2018 06:23
Небольшое сервисное дополнение.
Данный макрос позволяет нажимать в меню выбора вторую быструю клавишу, не отпуская модификаторы.
local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B"
local mod,k
Macro{
id="817F6653-F4AC-48DC-809B-7AD94AEFC8EC";
area="Menu";
key="/.+/";
priority=100;
condition=function(key)
mod,k = key:match("^(.+)(.)$")
return Menu.Id==MSMenuGuid and mod==Object.Title:match(" (%S+)%S$")
end;
action=function()
Keys(k)
if Menu.Value:match(mod..k.."$") then
Keys("Enter")
end
end;
}
Огромное спасибо за очередной подарок! Пытаюсь приспособить его к своим макросам.
И когда с данным установленным макросом после вызова меню, изображённого на выше приведённой картинке, на отмеченной позиции нажимаю Enter, 8 или S, то сразу же вызывается меню плагина. А когда нажимаю на AltShiftS, то меню тоже вызывается, но прежде появляется красная ошибка:
LuaMacro
...ндыВменюВыбораМакроса(IgorZ)men.lua:15: attempt to index field 'Value' (a nil value)
Stack Traceback
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
Тоже происходит и в других меню выбора макроса после попытки нажать шорткат, указанный в правой колонке меню.
Очень странно. Курсор стоит, как и на картинке? Тогда Menu.Value однозначно должно содержать значение текущей строки.
Единственное, что могу предположить - пересечение с ещё каким-то макросом. Хотя - приоритет 100 не должен давать...
Чтобы полностью исключить влияние других макросов, оставил в 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.
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;
}
Макросы можно активировать как точными сочетаниями, указываемыми в правом столбце меню выбора макроса, так и сочетаниями указанных завершающих клавиш с любыми другими модификаторами. Такая универсальность сделана потому, что в правом столбце меню могут быть не только однообразные сочетания клавиш с одними и теми же модификаторами, но и весьма разношёрстные по составу модификаторов. И только практика покажет насколько такой приём полезен.
В приводимом мною в теме примере так совпало, что запускающие сочетания в нём практически однообразные. Но пусть это не служит заблуждением, что однообразие модификаторов в ключах это правило для группирования макросов. Вовсе нет.
По какой причине луамакро отторгает применяемый в Вашем примере Menu.Value, подработанный матчем, я пока что не уразумел.
М.б. есть смысл спросить об этом у мастера Шмуэля?
IgorZ wrote: ↑Fri 07 Dec, 2018 06:23
Небольшое сервисное дополнение.
Данный макрос позволяет нажимать в меню выбора вторую быструю клавишу, не отпуская модификаторы.
local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B"
local mod,k
Macro{
id="817F6653-F4AC-48DC-809B-7AD94AEFC8EC";
area="Menu";
key="/.+/";
priority=100;
condition=function(key)
mod,k = key:match("^(.+)(.)$")
return Menu.Id==MSMenuGuid and mod==Object.Title:match(" (%S+)%S$")
end;
action=function()
Keys(k)
if Menu.Value:match(mod..k.."$") then
Keys("Enter")
end
end;
}
в строке if Menu.Value:match(mod..k.."$") then перед Menu.Value добавить позиционирование типа Menu.Select(k,2)>0 and, то вышеупомянутая красная ошибка выводиться не будет, и макрос отработает как первоначально задумано.
Поупражнявшись с вариациями макросов, составленных на основе любезно предоставленного Вами
IgorZ wrote: ↑Fri 07 Dec, 2018 06:23
Небольшое сервисное дополнение.
Данный макрос позволяет нажимать в меню выбора вторую быструю клавишу, не отпуская модификаторы.
local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B"
local mod,k
Macro{
id="817F6653-F4AC-48DC-809B-7AD94AEFC8EC";
area="Menu";
key="/.+/";
priority=100;
condition=function(key)
mod,k = key:match("^(.+)(.)$")
return Menu.Id==MSMenuGuid and mod==Object.Title:match(" (%S+)%S$")
end;
action=function()
Keys(k)
if Menu.Value:match(mod..k.."$") then
Keys("Enter")
end
end;
}
, на текущий момент остановился пока всё-таки на варианте сабжевого макроса:
John Doe wrote: ↑Fri 07 Dec, 2018 22:16
Причина проста: на момент вызова меню уже закрыто.
И немудрено, вы же там клавиши какие-то нажимаете.
Не всегда закрыто. Ошибка возникает, если последняя буква комбинации присутствует среди быстрых клавиш, назначенных LuaMacro. Тогда меню срабатывает сразу после Keys(k), иначе надо дополнительно жать Enter. Проверку вставить - и всё.
Поупражнявшись с вариациями макросов, составленных на основе любезно предоставленного Вами
IgorZ wrote: ↑Fri 07 Dec, 2018 06:23
Небольшое сервисное дополнение.
Данный макрос позволяет нажимать в меню выбора вторую быструю клавишу, не отпуская модификаторы.
local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B"
local mod,k
Macro{
id="817F6653-F4AC-48DC-809B-7AD94AEFC8EC";
area="Menu";
key="/.+/";
priority=100;
condition=function(key)
mod,k = key:match("^(.+)(.)$")
return Menu.Id==MSMenuGuid and mod==Object.Title:match(" (%S+)%S$")
end;
action=function()
Keys(k)
if Menu.Value:match(mod..k.."$") then
Keys("Enter")
end
end;
}
, на текущий момент остановился пока всё-таки на варианте сабжевого макроса:
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, мой вариант исправляется просто: соответствующая строка заменяется на
if Menu and Menu.Value and Menu.Value:match(mod..k.."$") then
С другой стороны, Ваш вариант имеет свои достоинства. Какой лучше - с ходу не скажу.
И наконец: для тестирования я использую выложенный Вами lfsearch_e ({S поискИзаменаВредакторе[lfsearch](smuel)(сАвтовыводомКлючейПоJD)pluEdi.lua. В ходе последних проверок наткнулся на две ошибки в строках
Функции GInfo и GetFileName - глобальные, определённые Вами где-то в другом файле? Если да, то, как минимум, требовалось явно указать, что данные макросы для корректной работы требуют другого файла, и приложить его или, хотя бы, ссылку на него, выложенного в другом месте. Если же нет, то это явная ошибка.
IgorZ wrote: ↑Mon 10 Dec, 2018 06:06
для тестирования я использую выложенный Вами lfsearch_e ({S поискИзаменаВредакторе[lfsearch](smuel)(сАвтовыводомКлючейПоJD)pluEdi.lua. В ходе последних проверок наткнулся на две ошибки в строках
Функции GInfo и GetFileName - глобальные, определённые Вами где-то в другом файле? Если да, то, как минимум, требовалось явно указать, что данные макросы для корректной работы требуют другого файла, и приложить его или, хотя бы, ссылку на него, выложенного в другом месте. Если же нет, то это явная ошибка.
Действительно, существенный блок выпал. Спасибо, что указали! Исправлено.
IgorZ wrote: ↑Mon 10 Dec, 2018 05:33
Назначение макроса строго конкретное: реагировать на нажатие комбинации, состоящей из модификатора, заданного первичной комбинацией, и буквы.
Для меня приведённый Вами пример макроса очень интересен и полезен. Но такое его ограниченное назначение подходит едва ли не к единственному случаю, относящемуся к приведённому мною в данной теме в качестве примера набору макросов, вызываемых единым ключом, модификаторы которого AltShift также присутствуют и во всех других ключах макросов, вызываемых из меню выбора макроса.
Так уж случайно сложилось, что ключи подобрались единообразные. Это для упрощения восприятия примера. Практически же в большинстве остальных случаев наборы модификаторов в ключах, вызывающих макросы из меню, могут быть самыми разнообразными, вплоть до полного не повторения в них набора модификаторов базового ключа, формирующего меню выбора. А могут и вовсе отсутствовать в отдельных ключах, вызываемых однознаковыми хоткеями.
И вот поэтому то, что Вы вполне резонно указываете далее:
IgorZ wrote: ↑Mon 10 Dec, 2018 06:06
Проверить соответствие модификатора можно только динамически, и это делается в condition, поэтому отсекание служебных клавиш абсолютно излишне (кроме, разве что, CtrlC, но если эта комбинация входит в список вторичных, то лучше её не игнорировать, а если не входит, то и так отработет стандартный вариант). Разумеется, если не выбрасывать из condition проверку, как это сделали Вы.
относится лишь к данному узкоспециализированному случаю. Когда набор модификаторов в базовом ключе, на основе которого сформировано данное конкретное меню выбора макроса, полностью совпадает с набором модификаторов в каждом из ключей данного сборника макросов. Но стоит только дополнить этот сборник хотя бы одном макросом, в ключе которого иной набор модификаторов (что на практике вероятнее всего и случится), и ограниченность действия приведённого Вами примера макроса тут же сказывается на его результате.
Отсюда и те изменения, которые я произвёл с макросом-примером, чтобы попытаться приблизить его к сабжевому варианту. В котором целенаправленно предусматривается активация любого макроса (из их перечня в меню выбора макроса) путём нажатия именно того шорката, который указан в конце строки — позиции данного макроса, не зависимо от того, каков в нём конкретный набор модификаторов. И опыт апробирования получившегося у меня варианта сабжевого макроса для меня очень ценен. Но об этом несколько позже и особняком.
IgorZ wrote: ↑Mon 10 Dec, 2018 06:06С другой стороны, Ваш вариант имеет свои достоинства. Какой лучше — с ходу не скажу.
Полагаю, что целесообразнее сравнивать не варианты приведённого Вами примера между собой. А оба их с исходным сабжевым макросом. На текущий момент у меня получились следующие результаты.
а) Об ограниченности действия приведённого Вами примера в его первоначальном виде я многословно писал чуть выше.
б) Его видоизменённый мною вариант почему-то не активирует макрос, если ему назначен ключ типа AltF3.
в)Сабжевый макрос оказался не отточен на случаи, когда более короткий ключ стоит в позиции ниже более длинного ключа, в который значение короткого входит в качестве составляющей. Например:
если в данном утрированном меню нажать на F3, то активирована будет позиция с ключом AltF3, поскольку он находится выше по списку.
upd: проблема в) решается тем, что в соответствующих местах макроса сопоставление указаний ключей в строках меню выбора макроса следует вести не с сугубо нажатым ключом, а с ключом, предваряемым одним пробелом: mf.substr(Menu.Value,-k:len(),k:len())==" "..k
и Menu.Select(mf.string(" "..k), 2, 0) > 0