0: выполнить макрос так же, как это делает eval(S,2)
1: вернуть Id макроса (или копию таблицы).
2: то же что 1, но не выводит меню конфликта, а возвращает в таблице список конфликтующих макросов (Id, или копии).
Возвращает:
mode==0
успех: true,... (значения, которые вернулись из action. не факт что нужны)
неудача: false,код ошибки (или строка)
mode==1 и mode==2
успех: Id макроса (или копию таблицы)
неудача: false,код ошибки (или строка)
Возможные ошибки: не найден, не соблюдены условия, завершился с ошибкой, меню конфликта отменено.
Описал только те возможности, которые реально нужны в моей практике.
Возможно могут быть и другие пожелания, интересно обсудить.
И второй вопрос, это интерфейс функции.
Например, в случае отсутствия макроса можно возвращать nil а не false.
Возможно кто-то предложит что-то лучше.
Почему новая функция: mf.eval и без того дико перегружена, причём большинство её возможностей нужны лишь для
обеспечения совместимости с макросами, написанными более 5 лет назад.
0: выполнить макрос так же, как это делает eval(S,2)
Желательно бы сделать так, чтобы при нулевом mode макрос выполнялся бы несколько по-иному.
А именно: с обязательным выводом меню выбора макросов.
В т.ч. и в тех случаях, когда на ключ назначен только один макрос. А также и в тех, когда макросы на него не назначены вовсе.
Т.е. с выводом также и "порожних" меню выбора макросов. Ведь на самом-то деле такие меню вовсе не пустые, поскольку из их заголовков можно почерпнуть полезную информацию.
И, кроме того, желательно также, чтобы по нажатию AltF4 в "порожнем" меню "Исполнить макрос" открывался бы на редактирование файл с шаблоном макроса.
В частности, обновил я намедни несколько макросов "перемотки", сконструированных для быстрого удобного обозрения последовательности меню выбора макросов, назначенных на любую интересующую меня клавишу саму по себе и в сочетаниях с модификаторами. В том или ином направлении по кругу. Два из них для примера прилагаются.
Принцип их работы простой. В наблюдаемом меню, нажимаю пусковую клавишу, и вместо данного меню смотрю следующее в зависимости от заданной последовательности. А дальше следующее по кругу хоть до бесконечности. Например, исходным может являться меню, вызванное по CtrlF7. Тогда, следом за ним можно посмотреть поочерёдно меню, вызываемое по AltF7, затем по ShiftF7, потом CtrlAltF7 и так далее: CtrlShiftF7, AltShiftF7, CtrlAltShiftF7, F7 и вновь CtrlF7. И, как уже отмечено, делать это можно в любом направлении просто дважды нажимая соответственно на левый или правый Alt. А другим макросом дважды нажимая на левый или правый Ctrl можно пройтись, например, по кругу линейки цифровых клавиш: CtrlF7, CtrlF8, CtrlF9, CtrlF10, CtrlF11, CtrlF12, CtrlF1, CtrlF2, CtrlF3, CtrlF4, CtrlF5, CtrlF6 и снова CtrlF7. Опять же из любой позиции и в любом направлении.
Это дольше описывать, чем делать. Мне практика такого облегчённого и быстрого практического обозрения очень помогает упорядочивать меню выбора макросов, расставлять макросы в нужном мне порядке, переставлять их местами для пущего удобства и добавлять в нужные места.
Сердцевиной макросов "перемотки", их движком, если можно так выразиться, является пара простых команд. Это Keys("F10") — сброс текущего меню и mf.eval("следующее клавишесочетание",2) — собственно переход к следующему по порядку меню. Вот, собственно о последней то команде и веду речь.
В том случае, когда, как в приведённых примерах, макросами охвачена вся линейка функциональных клавиш вкупе со всеми штатными модификаторами, макросы "перемотки" работают безукоризненно. Но в других случаях подобный макрос натыкается на отсутствие следующего по порядку меню и прекращает работу. А происходит это если требуемое "клавишесочетание" не задано. Тогда команда mf.eval("клавишесочетание",2) завершается ошибкой. Или, выполнив единственный макрос, заданный на "клавишесочетание", команда также прерывает работу макроса "перемотки".
Вот поэтому, желательно бы, что бы по команде mf.callmacro("клавишесочетание") вызывалось бы меню выбора макросов. Даже в том случае, когда на это "клавишесочетание" ни один макрос не задействован или задействован всего один.
Вовсе не ошибкой, а возвращается с вполне понятным кодом (-2), который вы могли обработать уже сейчас.
Кстати случай, когда макрос есть, но единственный тоже можно исхитриться и обработать, используя макрос с высоким приоритетом.
А используя предлагаемую функцию (из шапки) желаемое можно будет получить прямее, без хитростей.
Впрочем, зерно истины в вашем предложении всё-таки есть: можно предложить отдельный режим 3, в котором макрос не выполняется, а выводится Меню конфликта, даже если макрос единственный.
Было бы удобно использовать этот режим как фильтр, когда нужно посмотреть, какие макросы назначены на ту или иную клавишу, отредактировать, и т.п.
Т.е. вместо того, чтобы "мучительно искать" глазами в макробраузере можно было бы использовать (гипотетический) макрос вроде такого:
John Doe wrote: ↑Mon 27 Nov, 2017 16:12можно предложить отдельный режим 3, в котором макрос не выполняется, а выводится Меню конфликта, даже если макрос единственный ...
Спасибо за понимание! Именно подобного режима и не хватает!
--пытаемся получить меню для клавиши с другими модификаторами
if eval(newkey,2)==-2 then
--если на новую комбинацию макросов нет, то перевызываем прошлый макрос
eval(oldkey,2)
end