Обработчики событий: запуск макросов по событиям

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

Обработчики событий: запуск макросов по событиям

Post by John Doe »

Реализован запуск макросов по событиям (build 3157+), документация тут:

Данная статья в MacroAPI manual весьма лаконична, т.к. ссылается на LuaFAR manual, который в свою очередь ссылается на Far PluginAPI.
Скакать между различными файлами документации по меньшей мере неудобно (edit: уже появились гиперссылки, стало намного лучше).
Чтобы облегчить усвоение и без того непростого и фрагментированного материала я скомпоновал для себя информацию в одном месте.
  • result = export.ProcessViewerEvent (ViewerID, Event)
  • result = export.ProcessEditorEvent (EditorID, Event, Param)

    result = editor.SubscribeChangeEvent (EditorId, Subscribe)
  • result = export.ProcessEditorInput (Rec)
    Rec: table InputRecord
  • ret = export.ProcessDialogEvent (Event, Param)
Важно: Ограничения в использовании некоторых функций

Примеры обработчиков событий в готовых макросах:

Основная тема: LuaMacro — Lua как язык макросов
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

Re: Запуск макросов по событиям (build 3157+)

Post by Aidar »

Latest post of the previous page:

zg wrote:
t-rex wrote:И вообще на сколько известно этот EE_CHANGE нужен только тебе, и только в тех случаях когда ты дебагишь через редактор фара - т.е. скажем для 1% из редакторных сессий.
красящие плагины используют. тот же колорер.
Пакет LuaFAR area config для плагина LuaFAR for Editor тоже использует.
Shmuel wrote:

Code: Select all

shmuel 28.04.2013 16:32:41 +0200 - build 140
1. LuaFAR: новая функция editor.SubscribeChangeEvent.
2. В связи с появлением ECTL_SUBSCRIBECHANGEEVENT, ECTL_UNSUBSCRIBECHANGEEVENT (Фар 3.0.3371)
   откатываем 137.1 и 137.2.
137.1 и 137.2 - это http://forum.farmanager.com/viewtopic.p ... 10#p108510
137.1 был удобнее, а плагин сам бы мог определить, подписываться ему или нет на это событие.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Запуск макросов по событиям (build 3157+)

Post by Shmuel »

Aidar wrote:137.1 был удобнее, а плагин сам бы мог определить, подписываться ему или нет на это событие.
* Может и было удобнее, но не хочется без особой нужды отклоняться от API плагинов, изобретать новые сущности.
* Плагин и теперь может сам определить.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Запуск макросов по событиям (build 3157+)

Post by t-rex »

Ты счётчик коммитить не собираешся?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Запуск макросов по событиям (build 3157+)

Post by Shmuel »

t-rex wrote:Ты счётчик коммитить не собираешся?
Собираюсь, просто знаю, что это вроде никого пока не держит и хотел подождать день-два, вдруг новая идея появится.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Обработчики событий: запуск макросов по событиям

Post by John Doe »

0002595: Обработчики событий: добавить в спецификацию фильтр по Event и Msg

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

Предлагаю ввести опциональное поле filter, в котором указывать требуемое событие строкой, числом, или массивом.

Для диалоговых событий требуется второй аналогичный фильтр - filtermsg

P.S.
Добавлю что предлагаемый фильтр был с самого начала, в виде поля name, но в какой-то момент отменили: http://forum.farmanager.com/viewtopic.p ... 11#p103711
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Обработчики событий: запуск макросов по событиям

Post by John Doe »

Использование far.Message в обработчиках событий имеет странные последствия: после закрытия сообщения экран не обновляется, даже при нажатии курсорных клавиш. Только Home/End помогают.
Например:
Сообщение "VE_READ" отображается на фоне панелей, и даже после { OK } на экране всё ещё панели.

Использование far.Show не влечёт таких спецэффекетов.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Обработчики событий: запуск макросов по событиям

Post by zg »

John Doe wrote:Использование far.Message в обработчиках событий имеет странные последствия: после закрытия сообщения экран не обновляется, даже при нажатии курсорных клавиш.

Использование far.Show не влечёт таких спецэффекетов.
Message запрещает перерисовку. это на мантис надо, макросы тут вообще не причём.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Обработчики событий: запуск макросов по событиям

Post by John Doe »

P.S.
Появилась проблема в последних билдах, в 3987 ещё не было.

0002733
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Обработчики событий: запуск макросов по событиям

Post by zg »

John Doe wrote:Появилась проблема в последних билдах, в 3987 ещё не было.
иногда ошибки компенсируют друг друга. в фаре даже не иногда. про указанную особенность message упоминалось например тут, и это было до последних билдов. просто теперь вылезло ещё и здесь.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Обработчики событий: запуск макросов по событиям

Post by John Doe »

Событие ExitFAR сейчас вызывается и (1)при выгрузке/перезагрузке макросов, и (2)при выходе из фара (или выгрузке плагина).
Возникла потребность различать эти два случая.

Пока что обошёлся своими силами, используя тот факт, что при выходе из фара АПИ уже не функционирует (может быть что-то и работает, но в Энциклопедии не сказано).
Поэтому можно результат вызова какой-нибудь функции, например так:

Code: Select all

Event { group="ExitFAR"; description="test if Far is really exiting";
  action=function()
      if 0==far.AdvControl"ACTL_COMMIT" then
        io.write("Far is really exiting","\n")
        win.Sleep(10000)
      else
        far.Message("macros are unloading")
      end
  end;
}
Last edited by John Doe on Tue 30 Aug, 2016 09:37, edited 1 time in total.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Обработчики событий: запуск макросов по событиям

Post by Shmuel »

John Doe wrote: Возникла потребность различать эти два случая.
Вообще-то легко можно добавить параметр для action. Надо?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Обработчики событий: запуск макросов по событиям

Post by John Doe »

Вот как раз собирался попросить, но обнаружил, что для моей задачи надо отследить именно выход из фара.
А плагинам это событие приходит и при выгрузке (например по unload:).

Т.е. пока необходимости нет, буду смотреть по мере возникновения практических задач.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Обработчики событий: запуск макросов по событиям

Post by John Doe »

Shmuel wrote: Вообще-то легко можно добавить параметр для action. Надо?
Впрочем, посмотрев на свои макросы пришёл к выводу, что таки надо.
Способ, о котором я писал выше не позволяет определить что плагин выгружается, а иногда надо именно это.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Обработчики событий: запуск макросов по событиям

Post by Shmuel »

Если передавать параметр числом:
1 - окончание сессии Far либо выгрузка плагина
2 - _G.RecreateLuaState=true
3 - выгрузка либо перезагрузка макросов
Есть другие идеи?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Обработчики событий: запуск макросов по событиям

Post by John Doe »

Мне видится что различать выгрузку плагина и RecreateLuaState на практике вряд ли нужно, а если понадобится, то отличить можно анализируя эту самую переменную.
Поэтому я бы предложил ограничиться одним значением true/false (по смыслу UnloadMacro, или наоборот, TrueExit, имхо непринципиально)

P.S.
А вот что на практике надо, так это отличать окончание сессии фара от выгрузки плагина.
Но полагаю вы будете против, поскольку официально апи плагинов такого не предусматривает.
Last edited by John Doe on Mon 05 Sep, 2016 08:10, edited 1 time in total.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Обработчики событий: запуск макросов по событиям

Post by Shmuel »

John Doe wrote: отличить можно анализируя эту самую переменную
Всё гениальное просто.
John Doe wrote: А вот что на практике надо, так это отличать окончание сессии фара от выгрузки плагина.
Но полагаю вы будете против, поскольку официально апи плагинов такого не предусматривает.
Это можно сделать в рамках расширения API, т.к. ExitFARW() получает параметр-структуру, на данный момент пустую.
Post Reply

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