LuaFAR — библиотека для создания плагинов на языке Lua

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

LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Библиотека LuaFAR делает возможным написание плагинов на языке Lua, предоставляя им адаптированную версию FAR API.

Входит в состав FAR manager (начиная с 3.0 build 2851), и доступна для использования в макросах.

Справка по функциям библиотеки — luafar_manual.chm (в дистрибутиве, папка Encyclopedia).
Мануал весьма лаконичен, предполагает что вы ориентируетесь в FAR Plugins API (FarEncyclopedia.ru.chm, в дистрибутиве)

Дополнения к мануалу:

Полезное по теме: См. также:
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

Latest post of the previous page:

John Doe wrote: "Plugin.Call" невозможно вызвать из обработчика события.
Используйте Plugin.SyncCall.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Спасибо, совсем забыл о такой возможности.
gotar
Posts: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by gotar »

Shmuel wrote:А чего там разбираться, когда всё уже утряслось годы назад. Когда я начинаю новый плагин, на это уходит не более 5 минут.
Может быть Вы опубликуете исходные тексты каких нибудь из своих плагинов, кроме Hello world?
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

gotar wrote: Может быть Вы опубликуете исходные тексты каких нибудь из своих плагинов, кроме Hello world?
- https://github.com/shmuz/far_plugins
- LuaMacro
gotar
Posts: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by gotar »

https://github.com/shmuz/far_plugins/bl ... d/Makefile можно использовать как образец для подражения или лучше https://github.com/shmuz/far_plugins/bl ... l/Makefile

Примечание модератора: продолжение тут http://forum.farmanager.com/viewtopic.p ... 55#p128355
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by zg »

правильно ли я понимаю, что для нормальной работы lua-плагин должен всегда экспортировать exitfar?
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

zg wrote: правильно ли я понимаю, что для нормальной работы lua-плагин должен всегда экспортировать exitfar?
Насколько я знаю, то нет. Почему возник такой вопрос?
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by zg »

в luaplug.c баг был. например в LuaFAR History мог остаться не удалённый regex. при выходе в DestroyGlobal сначала удалялся g->StartupInfo, а потом делалось lua_close, где дёргался regex:__gc из которого была попытка вызвать g->StartupInfo.RegexControl.
при наличии exitfar lua_close зовётся оттуда и проблемы не возникает. как минимум LuaFAR History стоит пересобрать.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

Баг подтверждаю. Странно, что ни у меня, ни у других при этом ничего не падало (по крайней мере, не помню подобных репортов).
Насчёт пересборки - не помешает (LF History в любом случае пересоберётся, т.к. сегодня или завтра будет новая версия).
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by zg »

либо был exitfar, либо память не успевала измениться после удаления, либо gc срабатывал раньше.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

far.SubscribeDialogDrawEvents (в отличии от editor.SubscribeChangeEvent) очень простая функция: действует глобально (не только в текущем диалоге), и нет счётчика ссылок.

Реальной практической необходимости в совершенствовании far.SubscribeDialogDrawEvents у меня нет, но может быть стоит в документации подчеркнуть отличия в этих двух с виду однотипных функциях?
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

John Doe wrote: может быть стоит в документации подчеркнуть отличия в этих двух с виду однотипных функциях?
Документирование вгоняет меня в депрессию. :(
Но если предложите буквальные фразы, которые можно будет вставить, или патч, тогда уже будет теплее.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Note:
  • This function has global action (unlike editor.SubscribeChangeEvent), i.e. it affects all dialogs, until explicitly disabled.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by IgorZ »

Обнаружено странное поведение при нажатии шорткатов в диалогах. Проверено на чистой последней ночной версии (4392).
Вот демонстрационный код.

В диалоге имеем два элемента с одинаковым шорткатом. Обработчик перехватывает шорткат и, если активен первый элемент, то самостоятельно перекидывает на второй, а если активен второй, то на первый. Системе говорим ничего не делать. Если шорткат русский, то всё работает в соответствии c кодом, а если шорткат английский, то отработка нажатия и, соответственно, сообщение far.Message выдаётся 2 раза: первый - нормальный, о переходе на нужный элемент, а второй - о переходе обратно. ControlInput в обоих случаях отрабатывает один раз.
Не знаю, ошибка это LuaFAR или самого Far-а, поэтому пока пощу сюда. Если же LuaFAR ни при чём, то запощу в соответствующую тему об ошибках Far-а. Ну или сами, если удобно.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

Для проверки достаточно одного элемента с шорткатом, и не надо никаких хитрых переключений.
Если шорткат русский, то DN_HOTKEY приходит 1 раз; если английский, то 2 раза. Вот и всё.
Полагаю, что LuaFAR к этой проблеме отношения не имеет.

P.S. Да, существенным моментом для проявления неисправности является возвращение Фару FALSE из процедуры (то-есть указание отменить обработку клавиши).
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Shmuel wrote: Если шорткат русский, то DN_HOTKEY приходит 1 раз; если английский, то 2 раза. Вот и всё.
Уточнение.
Если нажатая клавиша и хоткей относятся одной раскладке, то приходит 2 сообщения.
Если нажатая клавиша и хоткей из разных раскладок, то приходит 1 сообщение.

Code: Select all

local F = far.Flags
local Items = {
--[[01]] {F.DI_DOUBLEBOX,   3, 1,20, 4,0,0,0,0,"Test hotkeys in dialog"},
--[[02]] {F.DI_CHECKBOX,    5, 2, 0, 2,2,0,0,F.DIF_3STATE,"&english"},
--[[03]] {F.DI_CHECKBOX,    5, 3, 0, 3,2,0,0,F.DIF_NONE,"&русский"},
}
far.Dialog("",-1,-1,22,6,nil,Items,nil,function(hDlg,Msg,Param1,Param2)
  if Msg==F.DN_HOTKEY then
    --far.Message("Hotkey: "..tostring(Param2.UnicodeChar))
    win.OutputDebugString(Param2.UnicodeChar)
    return 0
  end
end)
(следует учитывать, что если нажимается клавиша с Alt, то всегда приходит символ из английской раскладки, даже если активна русская)
Post Reply

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