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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 11251
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 82 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: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

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

Post by Shmuel » Sat 01 Aug, 2015 17:23

Latest post of the previous page:

John Doe wrote: предварительное обсуждение помогает сформулировать мысль максимально чётко
Согласен, но никто не запрещает параллельно к мантису обсуждать и на форуме. (Просто конкретно у меня сейчас не всегда получается оперативно обсуждать что-либо).

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

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

Post by John Doe » Sat 01 Aug, 2015 21:27

Запускаю следующий код, без макросов и плагинов (c:\Apps\Far3\Far.exe /p%FARHOME%\Plugins\LuaMacro /m):

Code: Select all

local F = far.Flags
local items = {
  {"DI_LISTBOX",3,1,16,4,{{Text="&atext"},{Text="&btext"},{Text="&ctext"}},nil,nil,{DIF_LISTNOAMPERSAND=1,DIF_LISTWRAPMODE=1}},
}
local Up = far.NameToInputRecord"Up"
far.Dialog("",0,0,19,5,nil,items,0,function(hDlg,Msg,ID,rec)
  if Msg==F.DN_CONTROLINPUT then
    hDlg:send(F.DM_KEY,nil,"Up")
    --hDlg:send(F.DM_KEY,nil,{Up})
    return 1
  end
end)


Пробую зажать какую-нибудь клавишу, и luamacro падает.
Иногда не с первого раза, но достаточно стабильно.

Если же использовать закомментированный вариант, то не падает.

Update: http://bugs.farmanager.com/view.php?id=3050

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

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

Post by Shmuel » Sat 01 Aug, 2015 22:23

В том случае, когда не падает, INPUT_RECORD, передаваемый Фару, формируется Фаром и LuaFAR'ом.
В том случае, когда падает, INPUT_RECORD, передаваемый Фару, формируется только самим Фаром.
Поэтому предполагаю, что причина в Фаре.
На мантис, раздел на ваше усмотрение.

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

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

Post by John Doe » Mon 17 Aug, 2015 21:19

В отладочных целях хочется иметь функцию вывода на экран типа far.Message, но с выключенной обработкой ProcessDialogEvent.
Вызов которой даже из DN_INITDIALOG не приводил бы к переполнению стека.
На мантис, отдельным тикетом?
Сюда вроде никак не вписывается http://bugs.farmanager.com/view.php?id=2416

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

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

Post by Shmuel » Mon 17 Aug, 2015 21:28

John Doe wrote: В отладочных целях хочется иметь функцию вывода на экран типа far.Message, но с выключенной обработкой ProcessDialogEvent.

Code: Select all

function far.DbgMessage(...)
  local old = export.ProcessDialogEvent
  export.ProcessDialogEvent = nil
  local ret = far.Message(...)
  export.ProcessDialogEvent = old
  return ret
end

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

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

Post by John Doe » Mon 17 Aug, 2015 21:46

Действительно!
Спасибо.

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

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

Post by John Doe » Tue 18 Aug, 2015 21:00

Заметил, что вызов far.SubscribeDialogDrawEvents не работает, в момент Msg==F.DN_INITDIALOG and Event==F.DE_DLGPROCINIT.
А в момент DE_DLGPROCEND работает.

Update: http://bugs.farmanager.com/view.php?id=3067

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

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

Post by Shmuel » Tue 18 Aug, 2015 22:24

John Doe wrote:Заметил, что вызов far.SubscribeDialogDrawEvents не работает, в момент Msg==F.DN_INITDIALOG and Event==F.DE_DLGPROCINIT.
А в момент DE_DLGPROCEND работает.
На мантис.

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

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

Post by John Doe » Tue 01 Sep, 2015 15:49

Функции far.Show (очевидно и far.Menu) не учитывают того, что порядок элементов может поменяться извне.
Для примера возьмём такой список:

Code: Select all

local ret = far.Show(1,2,3,4)
if ret then far.Message(ret.arg) end
Если в нём с помощью Enter выбрать пункт, то отобразится значение выбранного элемент.
Но если например таким макросом удалить первый пункт, то отобразиться неправильное значение.

Для решения этой проблемы можно использовать DM_LISTSETDATA/DM_LISTGETDATA.

Хотя конечно вопрос неоднозначный, и проблема реально глубже.
Ведь текущем виде апи far.Menu во многих случаях (BreakKeys) предполагается что скрипт сам получит текущий элемент по его индексу...

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

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

Post by Shmuel » Tue 01 Sep, 2015 19:39

Можете поместить на мантис.
Но вот я проверил ваш макрос на меню нескольких плагинов, не использующих LuaFAR (включая стандартный Arclite) - они все ломаются при этом.

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

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

Post by John Doe » Tue 01 Sep, 2015 19:51

Shmuel wrote: они все ломаются при этом.
И в самом фаре, в главном меню (в других местах нормально, хотя всё не проверял).
В Писании явно не сказано, вот никто и не учитывает такую ситуацию.
Shmuel wrote: Можете поместить на мантис.
Осталось понять, чего желать.
Учитывать только в возвращаемом значении недостаточно.

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

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

Post by Shmuel » Tue 01 Sep, 2015 19:57

John Doe wrote: Осталось понять, чего желать.
Как по мне, то можно оставить всё как есть. Не фиг лезть в чужое меню, удалять там пункты или менять их местами.

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

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

Post by John Doe » Tue 01 Sep, 2015 19:59

Shmuel wrote: Не фиг лезть в чужое меню, удалять там пункты или менять их местами.
Практика показывает что иногда надо: viewtopic.php?p=129347#p129347

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

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

Post by Shmuel » Tue 01 Sep, 2015 20:03

Это - хак, мне подобные вещи не нравятся. Впрочем, о вкусах не спорят.

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

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

Post by John Doe » Tue 01 Sep, 2015 20:08

Shmuel wrote: Это - хак
Не уверен, что это можно так квалифицировать. Используется легальное апи, по назначению.
У вас насколько я помню был макрос, убирающий скобки с кнопок. Хак или нет? Где грань?

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

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

Post by Shmuel » Tue 01 Sep, 2015 20:14

John Doe wrote: У вас насколько я помню был макрос, убирающий скобки с кнопок. Хак или нет? Где грань?
Это был хак. Но данный макрос я писал не для себя.
А грани чёткой действительно нет, поэтому каждый руководствуется своим чувством меры.

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

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

Post by John Doe » Tue 01 Sep, 2015 21:42

Shmuel wrote: Как по мне, то можно оставить всё как есть.
Полез посмотреть я как же оно в c api, и... завис.
Возвращаемое значение
Функция возвращает или -1, если пользователь отменил меню, или номер выбранного элемента меню.
Т.е. вижу что возвращается номер пункта, и всё.
Хоть убей НЕ ПОНИМАЮ как же тогда (например) в меню плагинов после удаления одного или нескольких пунктов по Enter вызывается правильный плагин?!

P.S.
Видимо изнутри фара меню не то же самое, что доступно через апи плагинам.
И как ни крути far.Menu невозможно научить тому, чего нет в апи.

Post Reply

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