Latest post of the previous page:
Это очень ситуативно. Зачастую прямо сейчас времени в обрез, стресс, а в другой раз и несколько часов порожнего дежурства и тогда времени на поиски ошибки предостаточно.
Latest post of the previous page:
Это очень ситуативно. Зачастую прямо сейчас времени в обрез, стресс, а в другой раз и несколько часов порожнего дежурства и тогда времени на поиски ошибки предостаточно.
m.key
: из двух предложенных мной вариантов sToLp выбрал первый, в котором данной проверки нет. Так что обсуждение данного вопроса неактуально. А вообще, все, казалось бы, избыточные проверки вставлялись мной с далеко идущей целью: в конечном итоге переопределять Macro
в _macroinit.lua
, чтобы не надо было переправлять Macro
на MMacro
. Тогда функции понадобится универсальность. Но в принятой sToLp редакции, как я уже заметил, есть только проверка на наличие и корректный тип поля key2
.Верно, тогда понадобилась бы.
S
, то сразу же вызывается меню плагина. А когда нажимаю на AltShiftS
, то меню тоже вызывается, но прежде появляется красная ошибка:
а строка 15 это:LuaMacro
...ндыВменюВыбораМакроса(IgorZ)men.lua:15: attempt to index field 'Value' (a nil value)
Stack Traceback
Code: Select all
if Menu.Value:match(mod..k.."$") then
С удовольствием ознакомился бы с тем, как это делается. Реализовывать то ведь это ни что не принуждает, а знать разные способы завсегда полезно.
И в большинстве случаев это так. Но, всё же, не в исключительном большинстве.как по мне, то пусть лучше она [ошибка] маячит перед глазами при загрузке макросов, чем забыть о ней совсем
Очень странно. Курсор стоит, как и на картинке? ТогдаsToLp wrote: ↑Fri 07 Dec, 2018 11:32 И когда с данным установленным макросом после вызова меню, изображённого на выше приведённой картинке, на отмеченной позиции нажимаю Enter, 8 илиS
, то сразу же вызывается меню плагина. А когда нажимаю наAltShiftS
, то меню тоже вызывается, но прежде появляется красная ошибка:а строка 15 это:LuaMacro
...ндыВменюВыбораМакроса(IgorZ)men.lua:15: attempt to index field 'Value' (a nil value)
Stack TracebackТоже происходит и в других меню выбора макроса после попытки нажать шорткат, указанный в правой колонке меню.Code: Select all
if Menu.Value:match(mod..k.."$") then
Menu.Value
однозначно должно содержать значение текущей строки.Неужели это реально можно сделать? Вот было бы здорово!
А строка 13 это: action=function()LuaMacro
...ндыВменюВыбораМакроса(IgorZ)men.lua:15: attempt to index field
'Value' (a nil value)
stack traceback:
...ндыВменюВыбораМакроса(IgorZ)men.lua: in function <...
ндыВменюВыбораМакроса(IgorZ)men.lua:13>
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;
}
if Menu.Value:match(mod..k.."$") then
перед Menu.Value
добавить позиционирование типа Menu.Select(k,2)>0 and
, то вышеупомянутая красная ошибка выводиться не будет, и макрос отработает как первоначально задумано. 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;
}
Не всегда закрыто. Ошибка возникает, если последняя буква комбинации присутствует среди быстрых клавиш, назначенных LuaMacro. Тогда меню срабатывает сразу после
Keys(k)
, иначе надо дополнительно жать Enter
. Проверку вставить - и всё.Для начала: такой замороченный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
Code: Select all
local f,l,y,x,p,n,s = GInfo()
Code: Select all
local f=GetFileName(l)
GInfo
и GetFileName
- глобальные, определённые Вами где-то в другом файле? Если да, то, как минимум, требовалось явно указать, что данные макросы для корректной работы требуют другого файла, и приложить его или, хотя бы, ссылку на него, выложенного в другом месте. Если же нет, то это явная ошибка.Действительно, существенный блок выпал. Спасибо, что указали! Исправлено.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()
Функции GInfo и GetFileName - глобальные, определённые Вами где-то в другом файле? Если да, то, как минимум, требовалось явно указать, что данные макросы для корректной работы требуют другого файла, и приложить его или, хотя бы, ссылку на него, выложенного в другом месте. Если же нет, то это явная ошибка.Code: Select all
local f=GetFileName(l)