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, в дистрибутиве)

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

Полезное по теме: См. также:
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 »

Latest post of the previous page:

Shmuel wrote: Fri 30 Apr, 2021 10:24 (Это была заготовка для LuaFAR, работающего с Lua 5.2).
Пребывал в заблуждении что это не просто заготовка, а более/менее поддерживаемый вариант компиляции.
https://t.me/FarManager — Telegram чат
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: Fri 30 Apr, 2021 11:24 Пребывал в заблуждении что это не просто заготовка, а более/менее поддерживаемый вариант компиляции.
Поддержка это время и труд, и если нет применения, то эти время и труд потрачены напрасно.
LuaJIT 2 (на мой взгляд) однозначно предпочтительнее, чем Lua 5.2.
Насчёт Lua 5.3/5.4 уже не так однозначно, но всё же (опять таки на мой взгляд) LuaJIT предпочтительнее.
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 »

Предлагаю патч для LuaFAR, который:
  1. Предотвращает падение при использовании DM_SETDLGDATA
  2. Делает поведение DM_GETDLGDATA и DM_SETDLGDATA детерминированным - это "no-ops", игнорирующие параметры и возвращающие nil
  3. Приводит мануал в соответствие с вышеизложенным
История данного патча.
patch.diff
(2.73 KiB) Downloaded 111 times
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: Mon 19 Jul, 2021 16:43 Предлагаю патч для LuaFAR
https://github.com/FarGroup/FarManager/pull/424
https://t.me/FarManager — Telegram чат
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: Mon 19 Jul, 2021 16:43 Делает поведение DM_GETDLGDATA и DM_SETDLGDATA детерминированным - это "no-ops", игнорирующие параметры и возвращающие nil
Помимо этих существуют подобные
GETITEMDATA/DM_LISTGETDATASIZE/DM_SETITEMDATA,
DM_LISTGETDATA/DM_LISTSETDATA

Насколько понимаю с ними никаких проблем (DM_LISTGETDATA даже делает различие между собственными и чужими данными).
Предполагаю, что и DM_GETDLGDATA / DM_SETDLGDATA можно было бы "исправить" совместимым образом.

Мне лично реально не хватает возможности прицепить к диалогу свои данные.
Конечно тут может возникнуть конфликт между скриптами, поэтому желательно работать с данными по ключу.

Реализовать подобное не "цепляя" данные к диалогу сейчас проблематично, поскольку диалоги в фаре (в отличии от редакторов и вьюеров) не обладают уникальными Id.

Update: https://bugs.farmanager.com/view.php?id=3883
Last edited by John Doe on Tue 27 Jul, 2021 09:38, edited 1 time in total.
https://t.me/FarManager — Telegram чат
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: Mon 26 Jul, 2021 12:53 Предполагаю, что и DM_GETDLGDATA / DM_SETDLGDATA можно было бы "исправить" совместимым образом.
Когда я делал патч для этих вызовов, возникла дилемма: сделать их полноценными и доступными для скриптов либо просто устранить падение.
Первый путь - это нетривиальная переделка, спокойно могла съесть целый рабочий день (учитывая, что я успел многое подзабыть). Пошёл по второму пути.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

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

Post by buniak_a_h »

John Doe wrote: Mon 26 Jul, 2021 12:53 не обладают уникальными Id
Может, я чего-то не понимаю … У редактора и вьюера Id числовой, а у диалогов - адрес (Хотя, может я и неправ). Но он всё равно уникальный. Так что послать диалогу сообщение можно.
John Doe wrote: Mon 26 Jul, 2021 12:53 не хватает возможности прицепить к диалогу свои данные.
Если диалог тоже мой - предусматриваю обработку DM_USER. Вроде, тоже самое…
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 »

buniak_a_h wrote: Mon 26 Jul, 2021 14:05 а у диалогов - адрес (Хотя, может я и неправ). Но он всё равно уникальный.
Уникальный в момент его получения. Через секунду уже может существовать другой диалог с тем же адресом.
buniak_a_h wrote: Mon 26 Jul, 2021 14:05 Если диалог тоже мой
Нет
https://t.me/FarManager — Telegram чат
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
У объекта regex отсутствует метод gmatch.
Этому есть причина, или просто не был реализован исторически?

Update: https://bugs.farmanager.com/view.php?id=3884
Last edited by John Doe on Tue 27 Jul, 2021 09:38, edited 1 time in total.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

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

Post by buniak_a_h »

Возможно, не в тему, но связанная "грёза":
в ФАРе есть куча диалогов, которые были бы полезны во многих местах. Напимер, диалог копирования/переноса-переименования, удаления и т.п. Нет ли возможности вызывать эти диалоги "снаружи" из скриптов? Как, например, OpenDialog в некоторых языках программирования.
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: Mon 26 Jul, 2021 14:07 У объекта regex отсутствует метод gmatch.
Этому есть причина, или просто не был реализован исторически?
Отвечал недавно здесь (могут быть несколько сообщений, не обязательно подряд).
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

buniak_a_h wrote: Mon 26 Jul, 2021 14:14куча диалогов, которые были бы полезны во многих местах.
тоже думал про это ненавижу диалоги рисовать.
Как вариант (не очень хороший) можно сделать автоматический дамп в Луа.
Тогда будет с интернализацией даже.
Можно даже при инициализации модуля, сделать автоматический вызов диалого макоросом,
для юзера это будет одноразово и мгновенно, просто что-то мелькнет.
Понятно что изврат, но в прынцыпе имеет право на жизнь, я щитаю
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

если кому-то нужен статус/список текущих диалогов, то есть эта вещь:
viewtopic.php?p=157608#p157608
запись данных идет вне зависимости надо менять размер диалога или нет.
в таблице _G.Xer0X.dlg_handles
уникальный ключ это xuid там.
lifecycle диалога отслеживается евентами.
просто "если вдруг кому надо"
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

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

Post by buniak_a_h »

citRiks wrote: Mon 26 Jul, 2021 21:09 можно сделать автоматический дамп в Луа.
Тогда будет с интернализацией даже.
Ниччо не понял… Что такое «дамп в Луа»? Что такое «интернализация»? Ели локализация - каким образом дамп позволит учесть язык?
Если "дамп в Луа" - это массив элементов, реализующих диалог, то такой скрипт у меня есть. В сочетании с моим же скриптом GetMsg он даже позволяет локализовать. Но это как-то пер-анально (проктологично). Но придётся делать свою библиотеку (коллекцию) диалогов.
Last edited by buniak_a_h on Mon 26 Jul, 2021 22:14, edited 1 time in total.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

Кажется, я нашёл ошибку в реализации win.MoveFile.
Такой демонстрационный скрипт:
  1. local d1,d2 = win.GetEnv("TMP").."\\1\\",win.GetEnv("TMP").."\\2\\"
  2.  
  3. win.CreateDir(d1) win.CreateDir(d2)
  4.  
  5. local f = io.open(d1.."1","w") f:write("1") f:close()
  6.  
  7. f = io.open(d2.."2","w") f:write("2") f:close()
  8.  
  9. far.Show(win.MoveFile(d1.."1",d2.."2","cr"))
  10.  
  11. far.Show(win.MoveFile(d1.."1",d2.."2","r"))
win.MoveFile(d1.."1",d2.."2","cr") выдаёт ошибку "Невозможно создать файл, так как он уже существует."
win.MoveFile(d1.."1",d2.."2","r") отрабатывает успешно.
Между тем, MoveFileEx позволяет комбинировать флаги.
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 »

IgorZ wrote: Tue 21 Dec, 2021 10:13 Кажется, я нашёл ошибку в реализации win.MoveFile.
Да, это так.
@Far Group:
Нужно в файле luamacro\luafar\win.c убрать else в каждой из строчек 594,595,596.
То есть, чтобы вместо else if был просто if в каждой из этих строчек.
Post Reply

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