Page 49 of 53

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

Posted: Wed 29 Jul, 2009 21:41
by John Doe
Библиотека LuaFAR делает возможным написание плагинов на языке Lua, предоставляя им адаптированную версию FAR API.

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

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

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

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

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

Posted: Fri 08 Nov, 2019 06:12
by IgorZ

Latest post of the previous page:

Shmuel wrote: Wed 06 Nov, 2019 08:32
IgorZ wrote: Wed 06 Nov, 2019 07:22 Как видно из примера, совершенно корректный синтаксически паттерн работает, повторённый 199 и менее раз, но вызывает ошибку pattern too complex, повторённый 200 и более раз.
Это же поведение у стандартного string.match. Ограничение вводится, чтобы предотвратить экспоненциальный рост времени исполнения с увеличением n.
Не баг, а фича? А она описана где-то? А то я, вроде бы, не видел в докуметации на Lua упоминания такого ограничения.
Shmuel wrote: Wed 06 Nov, 2019 08:32
IgorZ wrote: Wed 06 Nov, 2019 07:22 Вторая ошибка относится к regex.match:
И это тоже не ошибка. Для того, чтоб regex.match с паттерном "." находил "\n", ему нужно указать флаг "s" (см. документацию).
Про "s" я знаю... А, понял, в чём нюанс, действительно, мой косяк.
Shmuel wrote: Wed 06 Nov, 2019 08:32
IgorZ wrote: Wed 06 Nov, 2019 07:22 changelog LuaMacro до билда 698 включительно идёт по-русски, а начиная с билда 699 - по-английски. Это так и задумано?
Да. По здравому размышлению пришёл к выводу, что так будет правильнее. Английский знают во всём мире, а русский, к сожалению, нет.
Oll korrekt. :)

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

Posted: Mon 02 Dec, 2019 11:10
by IgorZ
Есть ли возможность, зная GUID панельного плагина, достать текущий каталог его панели (если их несколько, то той панели, что станет активной при активации плагина, например при выполнении команды tmp:)? Плагин, в общем случае, не открыт ни на одной из панелей. Я так понимаю, plugin_handle, который возвращает far.FindPlugin, не то же самое, что plugin object, который требует export.GetOpenPanelInfo?

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

Posted: Mon 02 Dec, 2019 12:11
by buniak_a_h
IgorZ wrote: Mon 02 Dec, 2019 11:10 текущий каталог его панели
Интересно... Я сделал панельный модуль, отображающий на панели структуру таблиц Lua (_G со вложениями). И что тут называть "каталогом"? И, кстати, плагин там - тот же, что в
Вашем скрипте - LuaMacro...

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

Posted: Mon 02 Dec, 2019 12:26
by buniak_a_h
IgorZ, ну и вдобавок… Видимо, не для всех плагиновых панелей определен каталог.У панели, принадлежащей временной панели, например, нет Path … Видимо, нужно более развёрнуто сформулировать вопрос.

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

Posted: Mon 02 Dec, 2019 16:32
by Shmuel
IgorZ wrote: Mon 02 Dec, 2019 11:10 Есть ли возможность, зная GUID панельного плагина, достать текущий каталог его панели (если их несколько, то той панели, что станет активной при активации плагина, например при выполнении команды tmp:)?
Такой возможности нет. Когда Фар закрывает панель плагина, то с точки зрения Фара её больше не существует. Плагин при этом может хранить состояние одной или более панелей в своей памяти и воссоздавать их впоследствии, но это уже внутренняя кухня плагина.
IgorZ wrote: Mon 02 Dec, 2019 11:10 Я так понимаю, plugin_handle, который возвращает far.FindPlugin, не то же самое, что plugin object, который требует export.GetOpenPanelInfo?
Для LuaFAR-плагинов, plugin handle - это то, как Фар видит панель плагина (величина, возвращённая из ф-ции OpenW), а plugin object - это то, как плагин видит свою панель (чаще всего это Lua-таблица, содержащая элементы панели и прочую информацию).

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

Posted: Tue 03 Dec, 2019 04:38
by IgorZ
Shmuel wrote: Mon 02 Dec, 2019 16:32
IgorZ wrote: Mon 02 Dec, 2019 11:10 Есть ли возможность, зная GUID панельного плагина, достать текущий каталог его панели (если их несколько, то той панели, что станет активной при активации плагина, например при выполнении команды tmp:)?
Такой возможности нет. Когда Фар закрывает панель плагина, то с точки зрения Фара её больше не существует. Плагин при этом может хранить состояние одной или более панелей в своей памяти и воссоздавать их впоследствии, но это уже внутренняя кухня плагина.
Ясно, спасибо. Значит, не выйдет каменный цветок.

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

Posted: Thu 12 Dec, 2019 07:30
by IgorZ
То ли туплю, то ли как...
Есть ли возможность в панельном модуле из своего GetFiles вызывать стандартный? Конкретно, чтобы копирование обрабатывать самостоятельно, а остальные действия (быстрый просмотр и прочие) отдавать Far-у. (Ещё лучше бы и копирование/перенос отдавать Far-у, только подменяя алгоритм копирования, но это, наверное, совсем слишком жирно.) Попробовал конструкцию вида

Code: Select all

GetFiles=function(object,handle,PanelItems,Move,DestPath,OpMode)
if band(OpMode,F.OPM_QUICKVIEW)~=0 then
  return export.GetFiles(object,handle,PanelItems,Move,DestPath,OpMode)
...
Но, судя по результату, что-то понял сильно не так. Появляется сообщение об ошибке:

Это делал на стабильной версии 5511, на 5523 только поменялся номер строки с ошибкой. Сама строка та же:

Code: Select all

      local func = wrapped_obj.module[name]

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

Posted: Thu 12 Dec, 2019 08:11
by buniak_a_h
IgorZ wrote: Thu 12 Dec, 2019 07:30 чтобы копирование обрабатывать самостоятельно, а остальные действия (быстрый просмотр и прочие) отдавать Far-у
А я не понял! В Вашем же панельном модуле просмотр и редактирование Вы не программировали, но они работают - т.е. отданы Far-у . Я как раз, наоборот, хотел у Вас узнать, почему стандартные редактирование-просмотр работают, а копирование - нет. :-)

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

Posted: Thu 12 Dec, 2019 10:16
by IgorZ
buniak_a_h wrote: Thu 12 Dec, 2019 08:11
IgorZ wrote: Thu 12 Dec, 2019 07:30 чтобы копирование обрабатывать самостоятельно, а остальные действия (быстрый просмотр и прочие) отдавать Far-у
А я не понял! В Вашем же панельном модуле просмотр и редактирование Вы не программировали, но они работают - т.е. отданы Far-у . Я как раз, наоборот, хотел у Вас узнать, почему стандартные редактирование-просмотр работают, а копирование - нет. :-)
Самому интересно. После того, как почитал внимательнее документацию, понял из неё, что чего-то не понял. Если нет ни GetFiles(), ни OPIF_EXTERNALGET в GetOpenPanelInfo(), но есть OPIF_REALNAMES, то (экспериментальные данные):
  • F3/AltF3 работают как обычно;
  • F4/AltF4 работают как обычно;
  • F5/F6 не работают;
  • ShiftF5/ShiftF6 работают как обычно;
  • F8/ShiftF8/ShiftDel/AltDel не работают;
  • CtrlQ работает, но неправильно: показывает пустоту (для каталогов - отсутствие содержимого).
Создаётся впечатление, что работают действия с одним файлом, не работают действия с группой файлов (правда, из этого принципа выпадает ShiftF8), и непонятная ситуация с быстрым просмотром.
С OPIF_EXTERNALGET и OPIF_EXTERNALDELETE работают все функции, причём правильно, но копирование/перенос кладут файлы без сохранения структуры дерева (а высказывалось пожелание копировать с её сохранением).
При использовании своей GetFiles() тот же быстрый просмотр работает, судя по всему, с расчётом, что пользователь выложит копию файла во временный каталог, а по окончанию просмотра Far удалит копию. Что отличается от поведения обычного просмотра и редактирования и от поведения быстрого просмотра при наличии OPIF_EXTERNALGET.
Вот поэтому я и заинтересовался, есть ли возможность копирование/перенос делать самому, а всё остальное отдавать Far-у.

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

Posted: Thu 12 Dec, 2019 10:20
by buniak_a_h
IgorZ wrote: Thu 12 Dec, 2019 10:16 F8/ShiftF8/ShiftDel/AltDel не работают;
Вы смотрели, может экспортируемая DeleteFiles вызывается? У меня, во всяком случае, в панельном модуле, отображающем структуру таблиц _G, вызывается.
Во! У вас не описана DeleteFiles !

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

Posted: Thu 12 Dec, 2019 10:27
by buniak_a_h
Еще, раз уж Вы такую работу провели… Что насчёт CtrlPgDn/Enter? Вот CtrlPgUp работает, хотя непонятно, почему - на панели могут быть совершенно отсутствующие на диске объекты. Например, как в моей фантазии на тему Вашего модуля. Я про внутренние архивированные файлы.

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

Posted: Thu 12 Dec, 2019 11:45
by IgorZ
buniak_a_h wrote: Thu 12 Dec, 2019 10:20
IgorZ wrote: Thu 12 Dec, 2019 10:16 F8/ShiftF8/ShiftDel/AltDel не работают;
Вы смотрели, может экспортируемая DeleteFiles вызывается? У меня, во всяком случае, в панельном модуле, отображающем структуру таблиц _G, вызывается.
Во! У вас не описана DeleteFiles !
Естественно, не описана.
В Энциклопедии wrote:OPIF_REALNAMES Включает использование стандартной обработки файла Far Manager'ом, если запрошенная операция не поддерживается плагином. Если этот флаг указан, элементы на панели плагина должны быть именами реальных файлов.
То есть, если плагин не экспортирует соответствующую функцию, то Far обрабатывает действие сам. DeleteFiles не экспортируется, значит, Far, по описанию, должен удалять сам.
Но реально, удаляет, если указан OPIF_EXTERNALDELETE.
buniak_a_h wrote: Thu 12 Dec, 2019 10:27 Еще, раз уж Вы такую работу провели… Что насчёт CtrlPgDn/Enter? Вот CtrlPgUp работает, хотя непонятно, почему - на панели могут быть совершенно отсутствующие на диске объекты. Например, как в моей фантазии на тему Вашего модуля. Я про внутренние архивированные файлы.
CtrlPgDn/Enter - по поведению полностью аналогично F5/F6.

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

Posted: Thu 12 Dec, 2019 16:35
by Shmuel
IgorZ wrote: Thu 12 Dec, 2019 07:30 Есть ли возможность в панельном модуле из своего GetFiles вызывать стандартный?
Как видно из последующего примера в вашем сообщении, под "стандартным" обработчиком вы имеете в виду export.<имя функции>. Это не так.

Плагин LuaMacro не имеет своего стандартного обработчика. Он сам не реализует экспортируемые панельные функции, это должны делать "панельные модули", которых может быть произвольное количество. Каждый панельный модуль - это как бы отдельный панельный плагин.

Задача плагина LuaMacro - быть посредником между панельными модулями и Фаром и, когда Фар вызывает какую-либо панельную экспортируемую функцию, LuaMacro находит модуль, к которому этот вызов относится и вызывает соответствующую ф-цию этого модуля, переправляя затем возвращённые данные Фару.

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

Posted: Fri 13 Dec, 2019 08:00
by IgorZ
Shmuel wrote: Thu 12 Dec, 2019 16:35
IgorZ wrote: Thu 12 Dec, 2019 07:30 Есть ли возможность в панельном модуле из своего GetFiles вызывать стандартный?
Как видно из последующего примера в вашем сообщении, под "стандартным" обработчиком вы имеете в виду export.<имя функции>. Это не так.
Плагин LuaMacro не имеет своего стандартного обработчика. Он сам не реализует экспортируемые панельные функции, это должны делать "панельные модули", которых может быть произвольное количество. Каждый панельный модуль - это как бы отдельный панельный плагин.
Задача плагина LuaMacro - быть посредником между панельными модулями и Фаром и, когда Фар вызывает какую-либо панельную экспортируемую функцию, LuaMacro находит модуль, к которому этот вызов относится и вызывает соответствующую ф-цию этого модуля, переправляя затем возвращённые данные Фару.
Не совсем корректно выразился. Я хотел (и хочу) узнать, возможно ли (и как) из своего GetFiles сказать: "Вот эту ситуацию я сам обработаю, а остальные меня не интересуют, возвращаю Far-у, пусть он обрабатывает" Скажем, при обработке многих событий вполне возможно из своего обработчика вернуть обработку события в Far, ожидал, что и здесь имеется такая же возможность, но перепробовал все варианты возвращаемого кода (1/0/-1) - не получилось. Думал, может через export.* это делается, но, оказалось, нет. Вот и сижу, думаю: то ли это и впрямь невозможно, и придётся писать обработку самому, то ли я где-то не вижу очевидного.

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

Posted: Fri 13 Dec, 2019 11:54
by zg
в GetOpenPanelInfo возвращаете соответствующие флаги, в зависимости от них будет или не будет вызываться GetFiles.

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

Posted: Mon 16 Dec, 2019 06:43
by IgorZ
zg wrote: Fri 13 Dec, 2019 11:54 в GetOpenPanelInfo возвращаете соответствующие флаги, в зависимости от них будет или не будет вызываться GetFiles.
Это я знаю. Я хочу из своего GetFiles, в зависимости от того, что пришло, или самому обработать, или вернуть Far, чтобы работал он. Задача - копирование/перенос делать самому, а всё остальное Far и без меня отлично обрабатывает. С удалением всё просто - оно GetFiles не касается, там свой обработчик. А вот Enter,PgDn,CtrlQ...
Я, конечно, с момента предыдущего поста не сидел на месте и уже сваял обход через ProcessPanelInput. Но он мне не совсем нравится. Да и разобраться до конца с нюансами работы с GetFiles хотелось бы, на будущее.