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

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

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

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

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

IgorZ
Posts: 697
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 63 times

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

Post 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. :)

IgorZ
Posts: 697
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 63 times

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

Post by IgorZ »

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

buniak_a_h
Posts: 1934
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 124 times
Been thanked: 183 times
Contact:

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

Post by buniak_a_h »

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

buniak_a_h
Posts: 1934
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 124 times
Been thanked: 183 times
Contact:

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

Post by buniak_a_h »

IgorZ, ну и вдобавок… Видимо, не для всех плагиновых панелей определен каталог.У панели, принадлежащей временной панели, например, нет Path … Видимо, нужно более развёрнуто сформулировать вопрос.

Shmuel
Posts: 6152
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 320 times

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

Post 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-таблица, содержащая элементы панели и прочую информацию).

IgorZ
Posts: 697
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 63 times

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

Post by IgorZ »

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

IgorZ
Posts: 697
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 63 times

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

Post 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]

buniak_a_h
Posts: 1934
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 124 times
Been thanked: 183 times
Contact:

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

Post by buniak_a_h »

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

IgorZ
Posts: 697
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 63 times

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

Post 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-у.
Last edited by IgorZ on Thu 12 Dec, 2019 10:18, edited 1 time in total.

buniak_a_h
Posts: 1934
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 124 times
Been thanked: 183 times
Contact:

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

Post by buniak_a_h »

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

buniak_a_h
Posts: 1934
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 124 times
Been thanked: 183 times
Contact:

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

Post by buniak_a_h »

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

IgorZ
Posts: 697
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 63 times

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

Post 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.
Last edited by IgorZ on Thu 12 Dec, 2019 11:47, edited 1 time in total.

Shmuel
Posts: 6152
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 320 times

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

Post by Shmuel »

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

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

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

IgorZ
Posts: 697
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 63 times

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

Post 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.* это делается, но, оказалось, нет. Вот и сижу, думаю: то ли это и впрямь невозможно, и придётся писать обработку самому, то ли я где-то не вижу очевидного.

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

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

Post by zg »

в GetOpenPanelInfo возвращаете соответствующие флаги, в зависимости от них будет или не будет вызываться GetFiles.

IgorZ
Posts: 697
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 63 times

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

Post by IgorZ »

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

Post Reply

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