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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13866
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 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, в дистрибутиве)

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

Полезное по теме: См. также:
User avatar
John Doe
Бюрократ
Posts: 13866
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Latest post of the previous page:

И если в том же меню будет одновременно BreakKey на ту же клавишу но с RIGHT_ALT_PRESSED/RIGHT_CTRL_PRESSED?
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

John Doe wrote: И если в том же меню будет одновременно BreakKey на ту же клавишу но с RIGHT_ALT_PRESSED/LEFT_CTRL_PRESSED?
Попробуйте, я не знаю.
User avatar
John Doe
Бюрократ
Posts: 13866
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Оказывается фар совсем не различает правые и левые модификаторы в BreakKeys: http://sourceforge.net/p/farmanager/cod ... i.cpp#l967
User avatar
John Doe
Бюрократ
Posts: 13866
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

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

Code: Select all

The filename, directory name, or volume label syntax is incorrect.
Если убрать любую пару кавычек, то всё нормально.
Что я делаю не так?
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

John Doe wrote: Что я делаю не так?
Ответ находится в описании синтаксиса комстроки cmd, там непростые правила трактовки кавычек. Знатоки объяснят лучше.
Но дело не в LuaFAR, у простого Lua/LuaJIT тоже есть проблемы с данной командой.
User avatar
John Doe
Бюрократ
Posts: 13866
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Спасибо, вот так работает:
lua:win.system[[""cmd.exe" /c "c:\autoexec.bat""]]
User avatar
John Doe
Бюрократ
Posts: 13866
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

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

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: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

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: 6038
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

Shmuel wrote:Следующий код показывает, что Фар продолжает вызывать диалоговую процедуру уже после возвращения из DialogRun.
а что здесь не так?
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

zg wrote:
Shmuel wrote:Следующий код показывает, что Фар продолжает вызывать диалоговую процедуру уже после возвращения из DialogRun.
а что здесь не так?
1. Диалог, вернувшийся из DialogRun(), это типа замороженный объект, он не исполняется. Его диалоговая процедура, логично предположить, также должна быть в это время заморожена. Это не документировано, но полагаю, что интуитивно для большинства людей это так.
2. Если задать диалогу правильные координаты (то-есть при которых диалог нормально отображается на экране), то после возврата из DialogRun диалоговая процедура не вызывается. По-видимому, так и было задумано.
User avatar
zg
zero-gravity
Posts: 6038
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

Shmuel wrote:1. Диалог, вернувшийся из DialogRun(), это типа замороженный объект, он не исполняется. Его диалоговая процедура, логично предположить, также должна быть в это время заморожена. Это не документировано, но полагаю, что интуитивно для большинства людей это так.
диалогу, вернувшемуся из DialogRun() вполне документировано можно слать сообщения, используя SendDlgMessage.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

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: 13866
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

far.DialogInit
В мануале не нашёл что произойдёт, если фар вернёт INVALID_HANDLE_VALUE
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

John Doe wrote: В мануале не нашёл что произойдёт, если фар вернёт INVALID_HANDLE_VALUE
Ничего не произойдёт, это означает, что Фар отказался создавать диалог.
В нашем случае Фар диалог создаёт, но работает с ним через одно место.
User avatar
John Doe
Бюрократ
Posts: 13866
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

А если отвлечься от нашего случая: что вернёт far.DialogInit?
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

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

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