mf.callmacro(key,area,mode)

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

mf.callmacro(key,area,mode)

Post by John Doe »

Предложение для обсуждения

Code: Select all

ret,...=mf.callmacro(key,area,mode)
Аргументы:
  • key,area - очевидны
  • mode:

    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 лет назад.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

mf.callmacro(key,area,mode)

Post by sToLp »

0: выполнить макрос так же, как это делает eval(S,2)
Желательно бы сделать так, чтобы при нулевом mode макрос выполнялся бы несколько по-иному.
А именно: с обязательным выводом меню выбора макросов.

В т.ч. и в тех случаях, когда на ключ назначен только один макрос. А также и в тех, когда макросы на него не назначены вовсе.

Т.е. с выводом также и "порожних" меню выбора макросов. Ведь на самом-то деле такие меню вовсе не пустые, поскольку из их заголовков можно почерпнуть полезную информацию.

И, кроме того, желательно также, чтобы по нажатию AltF4 в "порожнем" меню "Исполнить макрос" открывался бы на редактирование файл с шаблоном макроса.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

mf.callmacro(key,area,mode)

Post by John Doe »

sToLp,
Из вашего поста я не понял как вы предполагаете использовать mf.callmacro.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

mf.callmacro(key,area,mode)

Post by sToLp »

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

Принцип их работы простой. В наблюдаемом меню, нажимаю пусковую клавишу, и вместо данного меню смотрю следующее в зависимости от заданной последовательности. А дальше следующее по кругу хоть до бесконечности. Например, исходным может являться меню, вызванное по 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("клавишесочетание") вызывалось бы меню выбора макросов. Даже в том случае, когда на это "клавишесочетание" ни один макрос не задействован или задействован всего один.



Добавлено: иллюстрация работы одного из макросов "перемотки" была приведена там.
Last edited by sToLp on Sun 26 Nov, 2017 15:54, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

mf.callmacro(key,area,mode)

Post by John Doe »

sToLp wrote: Sun 26 Nov, 2017 15:00Тогда команда mf.eval("клавишесочетание",2) завершается ошибкой.
Вовсе не ошибкой, а возвращается с вполне понятным кодом (-2), который вы могли обработать уже сейчас.

Кстати случай, когда макрос есть, но единственный тоже можно исхитриться и обработать, используя макрос с высоким приоритетом.

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

Впрочем, зерно истины в вашем предложении всё-таки есть: можно предложить отдельный режим 3, в котором макрос не выполняется, а выводится Меню конфликта, даже если макрос единственный.
Было бы удобно использовать этот режим как фильтр, когда нужно посмотреть, какие макросы назначены на ту или иную клавишу, отредактировать, и т.п.

Т.е. вместо того, чтобы "мучительно искать" глазами в макробраузере можно было бы использовать (гипотетический) макрос вроде такого:

Code: Select all

Macro { description="Inspect macro by presed key";
  area="Common"; key="CtrlNumLock";
  action=function()
    mf.callmacro(mf.waitkey,nil,3)
  end;
}
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

mf.callmacro(key,area,mode)

Post by sToLp »

John Doe wrote: Mon 27 Nov, 2017 16:12можно предложить отдельный режим 3, в котором макрос не выполняется, а выводится Меню конфликта, даже если макрос единственный ...
Спасибо за понимание! Именно подобного режима и не хватает!

John Doe wrote: Mon 27 Nov, 2017 16:12
sToLp wrote: Sun 26 Nov, 2017 15:00Тогда команда mf.eval("клавишесочетание",2) завершается ошибкой.
Вовсе не ошибкой, а возвращается с вполне понятным кодом (-2), который вы могли обработать уже сейчас.
А вот того, что мною выделено подчёркиванием, я, увы, не понял. Вероятно, из-за банального недостатка компетентности.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

mf.callmacro(key,area,mode)

Post by John Doe »

Code: Select all

--пытаемся получить меню для клавиши с другими модификаторами
if eval(newkey,2)==-2 then
  --если на новую комбинацию макросов нет, то перевызываем прошлый макрос
  eval(oldkey,2)
end
Post Reply

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