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

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

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

Post by John Doe » Wed 29 Jul, 2009 21:41

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

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

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

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

Полезное по теме: См. также:

Shmuel
Posts: 5867
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

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

Post by Shmuel » Sat 20 Jun, 2015 19:52

Latest post of the previous page:

John Doe wrote: Правильно ли я понимаю, что LuaFAR не позволяет для BreakKeys меню различать правые/левые модификаторы?
LuaFAR подставляет вместо 'A' LEFT_ALT_PRESSED, а вместо 'C' - LEFT_CTRL_PRESSED.
Функция Фара Menu() при этом срабатывает как на левые, так и на правые модификаторы.

User avatar
John Doe
Бюрократ
Posts: 12366
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

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

Post by John Doe » Sat 20 Jun, 2015 19:59

И если в том же меню будет одновременно BreakKey на ту же клавишу но с RIGHT_ALT_PRESSED/RIGHT_CTRL_PRESSED?

Shmuel
Posts: 5867
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

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

Post by Shmuel » Sat 20 Jun, 2015 20:02

John Doe wrote: И если в том же меню будет одновременно BreakKey на ту же клавишу но с RIGHT_ALT_PRESSED/LEFT_CTRL_PRESSED?
Попробуйте, я не знаю.

User avatar
John Doe
Бюрократ
Posts: 12366
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

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

Post by John Doe » Mon 22 Jun, 2015 14:23

Оказывается фар совсем не различает правые и левые модификаторы в BreakKeys: http://sourceforge.net/p/farmanager/cod ... i.cpp#l967

User avatar
John Doe
Бюрократ
Posts: 12366
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

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

Post by John Doe » Sat 11 Jul, 2015 10:30

lua:win.system[["cmd.exe" /c "c:\autoexec.bat"]]

Code: Select all

The filename, directory name, or volume label syntax is incorrect.
Если убрать любую пару кавычек, то всё нормально.
Что я делаю не так?

Shmuel
Posts: 5867
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

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

Post by Shmuel » Sat 11 Jul, 2015 10:41

John Doe wrote: Что я делаю не так?
Ответ находится в описании синтаксиса комстроки cmd, там непростые правила трактовки кавычек. Знатоки объяснят лучше.
Но дело не в LuaFAR, у простого Lua/LuaJIT тоже есть проблемы с данной командой.

User avatar
John Doe
Бюрократ
Posts: 12366
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

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

Post by John Doe » Sat 11 Jul, 2015 10:43

Спасибо, вот так работает:
lua:win.system[[""cmd.exe" /c "c:\autoexec.bat""]]

User avatar
John Doe
Бюрократ
Posts: 12366
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

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

Post by John Doe » Sat 18 Jul, 2015 01:31

Случайно наткнулся на странный эффект:

Code: Select all

lua:
local hDlg = far.DialogInit("",-1,50,105,31,nil,{{far.Flags.DI_DOUBLEBOX,2,1,10,10,0}},0,function()end)
far.Show(far.DialogRun(hDlg))
far.DialogFree(hDlg)
Здесь координата Y1 заданы некорректно, за пределами экрана
Если запустить этот код из командной строки, то после закрытия far.Show() появится такое сообщение:

Code: Select all

╔═══════════════════ Error ═══════════════════╗
║ C:\Apps\Far3\Plugins\LuaMacro\LuaMacro.dll: ║
║ attempt to call a nil value                 ║
║ stack traceback:                            ║
╟─────────────────────────────────────────────╢
║                   { OK }                    ║
╚═════════════════════════════════════════════╝
И после этого всё что касается панелей, курсора, и командной строки перестаёт обновляться, застывает.
Меню, автодополнение, справка, выход из фара, ... - работают.

Shmuel
Posts: 5867
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

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

Post by Shmuel » Sat 18 Jul, 2015 12:00

John Doe wrote: Случайно наткнулся на странный эффект:
Это оказался твёрдый орешек для отладки.
Следующий код показывает, что Фар продолжает вызывать диалоговую процедуру уже после возвращения из DialogRun. (Проверял с отключенными макросами, утилитой Lua Script плагина LF4Ed, вызываемой шорткатом).


P.S. Нет, это ещё не конец, надо смотреть дальше.
Не исключено, что Фар повреждает область памяти, занятую Lua/LuaFAR.
Наверное надо чинить Фар сначала (http://bugs.farmanager.com/view.php?id=3029).

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

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

Post by zg » Sat 18 Jul, 2015 21:07

Shmuel wrote:Следующий код показывает, что Фар продолжает вызывать диалоговую процедуру уже после возвращения из DialogRun.
а что здесь не так?

Shmuel
Posts: 5867
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

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

Post by Shmuel » Sat 18 Jul, 2015 21:40

zg wrote:
Shmuel wrote:Следующий код показывает, что Фар продолжает вызывать диалоговую процедуру уже после возвращения из DialogRun.
а что здесь не так?
1. Диалог, вернувшийся из DialogRun(), это типа замороженный объект, он не исполняется. Его диалоговая процедура, логично предположить, также должна быть в это время заморожена. Это не документировано, но полагаю, что интуитивно для большинства людей это так.
2. Если задать диалогу правильные координаты (то-есть при которых диалог нормально отображается на экране), то после возврата из DialogRun диалоговая процедура не вызывается. По-видимому, так и было задумано.

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

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

Post by zg » Sun 19 Jul, 2015 00:01

Shmuel wrote:1. Диалог, вернувшийся из DialogRun(), это типа замороженный объект, он не исполняется. Его диалоговая процедура, логично предположить, также должна быть в это время заморожена. Это не документировано, но полагаю, что интуитивно для большинства людей это так.
диалогу, вернувшемуся из DialogRun() вполне документировано можно слать сообщения, используя SendDlgMessage.

Shmuel
Posts: 5867
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

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

Post by Shmuel » Sun 19 Jul, 2015 10:19

John Doe wrote: Случайно наткнулся на странный эффект:
Дополнительной отладкой выяснилось, что Фар в этом опыте после возврата из DialogRun() фактически диалог не закрывает, продолжает посылать сообщения (DN_ENTERIDLE). Более того, и после вызова DialogFree(), диалоговая процедура продолжает вызываться, что и приводит к ошибке, наподобие той, что вы наблюдали.

Code: Select all

00000001	0.00000000	[280] LF_DlgProc entry: hDlg=01437470	
00000002	0.00011092	[280] LF_DlgProc entry: hDlg=01437470	
00000003	0.00028481	[280] far_DialogFree entry	
00000004	0.00029542	[280] calling Info->DialogFree	
00000005	0.00033408	[280] far_DialogFree exit	
00000006	0.01135063	[280] LF_DlgProc entry: hDlg=01437470	
00000007	0.01206733	[280] pcall_msg: error: attempt to call a number value	
00000008	0.01206733	[280] stack traceback:	

User avatar
John Doe
Бюрократ
Posts: 12366
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

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

Post by John Doe » Sun 19 Jul, 2015 11:13

far.DialogInit
В мануале не нашёл что произойдёт, если фар вернёт INVALID_HANDLE_VALUE

Shmuel
Posts: 5867
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

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

Post by Shmuel » Sun 19 Jul, 2015 11:17

John Doe wrote: В мануале не нашёл что произойдёт, если фар вернёт INVALID_HANDLE_VALUE
Ничего не произойдёт, это означает, что Фар отказался создавать диалог.
В нашем случае Фар диалог создаёт, но работает с ним через одно место.

User avatar
John Doe
Бюрократ
Posts: 12366
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

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

Post by John Doe » Sun 19 Jul, 2015 11:28

А если отвлечься от нашего случая: что вернёт far.DialogInit?

Shmuel
Posts: 5867
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

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

Post by Shmuel » Sun 19 Jul, 2015 11:31

В нормальном случае - специальный тип userdata ("FarDialog"), а при INVALID_HANDLE_VALUE вернёт nil.

Post Reply

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