hh.exe %FARHOME%\Encyclopedia\macroapi_manual.ru.chm::/78.html
Как и стационарные макросы, обработчики событий загружаются из Lua-файлов (расширение *.lua), находящихся в папке %FARPROFILE%\Macros\scripts и её подпапках. Каждый Lua-файл может содержать вместе и макросы, и обработчики событий.
Загрузка обработчика происходит при вызове глобальной функции Event, которой передаётся один аргумент – таблица с параметрами обработчика.
Поле group может иметь одно из следующих значений:Code: Select all
Event { group = "EditorEvent"; -- string description = "Event example"; -- string (опциональное поле) filemask = "*.txt,*.cpp"; -- string (опциональное поле) priority = 50; -- number (опциональное поле) condition = function() ...... end; -- function (опциональное поле) action = function() ...... end; -- function }
"DialogEvent", "EditorEvent", "EditorInput", "ExitFAR", "ViewerEvent".
Данные имена являются производными от имён соответствующих функций, экспортируемых плагином, например:
Функции condition и action обработчика вызываются с теми же параметрами, с которыми вызывается соответствующая экспортируемая функция (см. мануал LuaFAR).Code: Select all
export.ProcessDialogEvent -> DialogEvent
При наличии нескольких обработчиков одного и того же события (т.е. обработчиков с одинаковым полем group), эти обработчики будут вызваны по очереди: обработчик с более высоким приоритетом вызывается раньше. Приоритет определяется динамически с учётом функции condition, если таковая имеется, как и для макросов.
Событие "ExitFAR" вызывается в следующих случаях: (a) выход из Far Manager, (b) выгрузка плагина LuaMacro, (c) выгрузка либо перезагрузка макросов.
Данная статья в MacroAPI manual весьма лаконична, т.к. ссылается на LuaFAR manual, который в свою очередь ссылается на Far PluginAPI.
Скакать между различными файлами документации по меньшей мере неудобно (edit: уже появились гиперссылки, стало намного лучше).
Чтобы облегчить усвоение и без того непростого и фрагментированного материала я скомпоновал для себя информацию в одном месте.
- hh.exe %FARHOME%\Encyclopedia\luafar_manual.chm::/127.html
Code: Select all
result = export.ProcessViewerEvent (ViewerID, Event) Parameters: ViewerID: integer Event: integer Returns: result: integer
http://api.farmanager.com/ru/viewerapi/index.html
http://api.farmanager.com/ru/structures ... tinfo.html VE_CLOSE VE_READ VE_KILLFOCUS VE_GOTFOCUSresult = export.ProcessViewerEvent (ViewerID, Event)
- hh.exe %FARHOME%\Encyclopedia\luafar_manual.chm::/110.html
Code: Select all
result = export.ProcessEditorEvent (EditorID, Event, Param) Parameters: EditorID: integer Event: integer Param: table (for EE_CHANGE): Type: integer StringNumber: integer integer (for other events) Returns: result: integer
http://api.farmanager.com/ru/editorapi/index.html
http://api.farmanager.com/ru/structures ... tinfo.html EE_CLOSE EE_READ EE_SAVE EE_REDRAW EE_KILLFOCUS EE_GOTFOCUS EE_CHANGEresult = export.ProcessEditorEvent (EditorID, Event, Param)
hh.exe %FARHOME%\Encyclopedia\macroapi_manual.chm::/84.html
Библиотека LuaFAR содержит функцию editor.SubscribeChangeEvent. Для макросов-обработчиков событий эта функция переопределена плагином LuaMacro:- Вызов оригинальной функции происходит только при переходе внутреннего счётчика подписок из 0 в 1 (если аргумент Subscribe==true), либо из 1 в 0 (если аргумент Subscribe==false). Поэтому нужно, чтобы в каждом обработчике, делающем вызов Subscribe==true, был и парный вызов Subscribe==false.
- В отличие от плагинов, событие EE_CHANGE может приходить независимо от того, вызывал ли данный обработчик функцию editor.SubscribeChangeEvent или не вызывал.
- Счётчики подписок отдельные для каждой сессии редактора.
hh.exe %FARHOME%\Encyclopedia\luafar_manual.chm::/486.htmlCode: Select all
result = editor.SubscribeChangeEvent (EditorId, Subscribe) Parameters: EditorId: integer, or nil Subscribe: boolean (true means "subscribe", false means "unsubscribe") Returns: result: boolean
result = editor.SubscribeChangeEvent (EditorId, Subscribe)
- hh.exe %FARHOME%\Encyclopedia\luafar_manual.chm::/111.html
Code: Select all
result = export.ProcessEditorInput (Rec) Parameters: Rec: table InputRecord Returns: result: boolean
Функция ProcessEditorInputW вызывается всякий раз, когда внутренний редактор Far Manager обрабатывает событие от клавиатуры или мыши.
result = export.ProcessEditorInput (Rec)
hh.exe %FARHOME%\Encyclopedia\luafar_manual.chm::/187.htmlhh.exe %FARHOME%\Encyclopedia\luafar_manual.chm::/313.htmlCode: Select all
Rec: table InputRecord The table has the following fields: EventType: integer --if EventType is KEY_EVENT or FARMACRO_KEY_EVENT: KeyDown: boolean RepeatCount: integer VirtualKeyCode: integer VirtualScanCode: integer UnicodeChar: string ControlKeyState: integer --if EventType is MOUSE_EVENT: see MouseEventRecord --if EventType is WINDOW_BUFFER_SIZE_EVENT: SizeX integer SizeY integer --if EventType is MENU_EVENT: CommandId integer --if EventType is FOCUS_EVENT: SetFocus boolean
Code: Select all
MouseEventRecord The table has the following fields: MousePositionX : integer MousePositionY : integer ButtonState : integer ControlKeyState : integer EventFlags : integer
Rec: table InputRecord
- hh.exe %FARHOME%\Encyclopedia\luafar_manual.chm::/221.htmlhh.exe %FARHOME%\Encyclopedia\luafar_manual.chm::/285.html
Code: Select all
ret = export.ProcessDialogEvent (Event, Param) Parameters: Event: integer Param: table FarDialogEvent hDlg : userdata Msg : integer Param1 : integer Param2 : integer Result : integer Returns: ret: integer, or nil Description: If ret is nil or false, then the event processing will continue. Otherwise, it is assumed that the plugin has processed the event, and ret will then be used as the return value of the dialog event handler.
Code: Select all
Parameters passed to event handler Param1 is integer for all event types (1-based if it is ID of a dialog element, 0-based otherwise). For most event types, Param2 is also integer, in accordance to Far API. For some events, Param2 is non-integer, see the articles describing those events. Treating the return value of dialog event handler (in the order of preference) Return value of nil (or no value) causes DefDlgProc to be called. Its return value is returned to Far. For some events (DN_CTLCOLORDLGLIST, DN_HELP, etc.), see the return values and their meaning in the article describing that event. If the return value is number, then that number is returned to Far. Otherwise, the boolean equivalent of the return value (that is, either 0 or 1) is returned to Far.
http://api.farmanager.com/ru/dialogapi/index.htmlhttp://api.farmanager.com/ru/dialogapi/about.html wrote:DialogAPI выделен в отдельное API, для максимального контроля над созданным диалогом.
Менеджер диалогов поддерживает только так называемые Модальные Диалоги (Modal Dialog). Модальный диалог представляет собой окно, запрещающее пользователю взаимодействовать с любым объектом FAR Manager вне данного диалога. Модальный диалог отсекает поток сообщений, идущих от мыши или клавиатуры к другим объектам FAR Manager.
Подробности
Плагин полностью управляет поведением диалога:- диалог имеет функцию-обработчик, которая реагирует на массу событий, приходящих от Менеджера диалогов;
- функция-обработчик общается с Менеджером Диалогов путём посылки сообщений, используя функцию SendDlgMessage;
- функция-обработчик может передать управление Менеджеру Диалогов используя функцию DefDlgProc;
- окончанием обработки диалога управляет плагин.
Итак. Dialog API:- // минимальный обработчик диалога
- intptr_t WINAPI MyDlgProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void *Param2)
- {
- return Info.DefDlgProc(hDlg,Msg,Param1,Param2);
- }
GeSHi © Codebox Plus Extension
- Сервисные функции и cтруктуры
- Макросы и типы
- Элементы диалога
- Флаги элементов диалога
- События
- Сообщения
http://api.farmanager.com/ru/structures ... tinfo.html DE_DLGPROCINIT DE_DEFDLGPROCINIT DE_DLGPROCEND http://api.farmanager.com/ru/dialogapi/ ... ex_dn.html DN_BTNCLICK DN_CLOSE DN_CONTROLINPUT DN_CTLCOLORDIALOG DN_CTLCOLORDLGITEM DN_CTLCOLORDLGLIST DN_DRAGGED DN_DRAWDIALOG DN_DRAWDIALOGDONE DN_DRAWDLGITEM DN_EDITCHANGE DN_ENTERIDLE DN_GETVALUE DN_GOTFOCUS DN_HELP DN_HOTKEY DN_INITDIALOG DN_INPUT DN_KILLFOCUS DN_LISTCHANGE DN_LISTHOTKEY DN_RESIZECONSOLEret = export.ProcessDialogEvent (Event, Param)
hh.exe %FARHOME%\Encyclopedia\macroapi_manual.chm::/62.html
К пункту 3: пример использования far.MacroPost, mf.postmacroСледующие функции имеют особенности реализации, которые накладывают определённые ограничения на их использование в макросах:
- exit
- mf.usermenu (в “асинхронном” режиме вызова)
- Keys
- Plugin.Call
- Plugin.Command
- Plugin.Config
- Plugin.Menu
- printf
Ограничения пункта 3 не имеют места, если вышеперечисленные функции вызываются не напрямую, а посредством mf.postmacro или far.MacroPost.
- Если макрос создаёт корутины с помощью coroutine.wrap(f), то вышеперечисленные функции не будут работать, будучи вызванными из тела функции f.
Данного ограничения нет, если корутины создаются с помощью coroutine.create(f).- Вышеперечисленные функции, будучи вызванными прямо или косвенно посредством функции pcall, приведут к немедленному возврату pcall с результатом false.
Данного ограничения нет при использовании LuaJIT 2.0.- Вышеперечисленные функции не будут работать, будучи вызванными из:
- диалоговых процедур
- функции condition макроса
- обработчиков событий
Примеры обработчиков событий в готовых макросах:
- FIN alt. — Fix Incorrect Names
Дополнение маски в диалоге поиска файлов
Cross — крест в редакторе, рисуется при нажатом скроллоке
Макрос для проверки орфографии в редакторе
Макрос для быстрого просмотра картинок
Автофильтр меню — автоматическая активация режима фильтрации в заданных меню.
Автовыделение последнего выполненного пункта меню
(отключение BOM для новых файлов)
(установка кодовой страницы в редакторе для файлов по маске)
(перезапись с удалением в Корзину)
Основная тема: LuaMacro — Lua как язык макросов