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

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

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

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

Smitis
Posts: 1612
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 39 times

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

Post by Smitis »

Latest post of the previous page:

aflexus wrote:Как? Можно какой-либо пример, плиз? В добавок, у Sudo даже настроек нет, как узнать его ID?
lua:Plugin.Command("C5DA0A14-FFAF-453E-9C3A-10B4C0FC0804","sudo:notepad.exe")
Разум когда-нибудь победит.

aflexus
Posts: 51
Joined: Sat 12 Mar, 2011 16:57
Has thanked: 12 times

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

Post by aflexus »

Smitis wrote: Примеров нет. Id=C5DA0A14-FFAF-453E-9C3A-10B4C0FC0804 (если не ошибаюсь)
Этот GUID ничего не дает. Ни через lua:Plugin.Call ни через lua:Plugin.Command. Либо GUID не верный, либо плагин не поддерживает такие вызовы...
aflexus wrote: lua:Plugin.Command("C5DA0A14-FFAF-453E-9C3A-10B4C0FC0804","sudo:notepad.exe")
Если так то да, процесс можно запустить. А как теперь к запуску процесса добавить возможность использования переменных? Интерактивного запроса?

Вот раньше через юзер меню можно было вот так:

Code: Select all

set FW_Port=!?Enter Port?!
netsh advfirewall firewall add rule name="Allow in TCP port %FW_Port%" protocol=TCP localport=%FW_Port% action=allow dir=IN
Теперь это не работает по причине UAC плюс сам sudo не подхватывает установленную переменную через set. А целиком через lua это можно реализовать? Плюс вызвать процесс с повышенными привилегиями?

Smitis
Posts: 1612
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 39 times

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

Post by Smitis »

Как-то так
lua:local port=far.InputBox(nil,"Enter port","") if port then Plugin.Command("C5DA0A14-FFAF-453E-9C3A-10B4C0FC0804",('sudo:netsh advfirewall firewall add rule name="Allow in TCP port %s" protocol=TCP localport=%s action=allow dir=IN'):format(port,port)) end
Я sudo не использую, показываю сам принцип, как подобное можно сделать через пользовательское меню или комстроку.

Если строка получается слишком сложной, делайте как здесь http://forum.farmanager.com/viewtopic.p ... ss#p132691
Т.е. создайте свою глобальную функцию, а лучше таблицу с функцией, чтобы избежать случайного конфликта имён, типа

Code: Select all

_G.aflexus = aflexus or {} -- Ваша таблица
aflexus.netsh_advfirewall = function() -- Ваша функция
    local port=far.InputBox(nil,"Enter port","")
    if port then
        Plugin.Command("C5DA0A14-FFAF-453E-9C3A-10B4C0FC0804",('sudo:netsh advfirewall firewall add rule name="Allow in TCP port %s" protocol=TCP localport=%s action=allow dir=IN'):format(port,port))
    end
end
А в меню вставляйте lua:aflexus.netsh_advfirewall()
Разум когда-нибудь победит.

aflexus
Posts: 51
Joined: Sat 12 Mar, 2011 16:57
Has thanked: 12 times

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

Post by aflexus »

Smitis, О!!! Как раз то, что мне было нужно! Спасибо огромное! :)

Smitis
Posts: 1612
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 39 times

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

Post by Smitis »

Функция GetRegKey на ФАР x86 на Windows x64 работает с редиректом WOW64 (или как там он правильно называется), т.е., например, вместо HKLM\SOFTWARE читает из HKLM\SOFTWARE\Wow6432Node
Остальные функции для работы с реестром не проверял, подозреваю, что там может быть также. Это как-то лечится? Ведь сам ФАР с той же файловой системой работает нормально.
Разум когда-нибудь победит.

User avatar
DrKnS
Posts: 5568
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 7 times
Been thanked: 291 times

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

Post by DrKnS »


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

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

Post by Shmuel »

Smitis, поместите виш на мантис.

Smitis
Posts: 1612
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 39 times

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

Post by Smitis »

Разум когда-нибудь победит.

IgorZ
Posts: 679
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 56 times

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

Post by IgorZ »

Вероятно, обнаружена ошибка в CommandLine. Или в документации. В примере

Code: Select all

CommandLine {
  description = "test CommandLine"; prefixes = "zz";
  action = function() Keys("A") end;
}
Keys вызывает . При этом

Code: Select all

CommandLine {
  description = "test CommandLine"; prefixes = "zz";
  action = function() mf.postmacro(Keys,"A") end;
}
ошибки не вызывает.

Следует либо исправить ошибку, либо, если это так и задумано, явно прописать в документации, что в CommandLine не работает Keys и, видимо, остальные функции, на использование которых есть ограничения.

Проверено на Far 3.0.4539 x86 под Windows XP - профиль нулевой, других скриптов нет, из плагинов только LuaMacro.

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

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

Post by Shmuel »

IgorZ wrote: Вероятно, обнаружена ошибка в CommandLine. Или в документации.
Скорее неполнота документации.
Общее правило таково, что т.н. "функции с ограничением в использовании" могут работать только из функции action макроса. Все прочие варианты пролетают (Event, CommandLine, MenuItem, condition).

IgorZ
Posts: 679
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 56 times

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

Post by IgorZ »

Shmuel wrote:Скорее неполнота документации.
Общее правило таково, что т.н. "функции с ограничением в использовании" могут работать только из функции action макроса. Все прочие варианты пролетают (Event, CommandLine, MenuItem, condition).
OK. Тогда хотелось бы поправки документации. Даже не столько для себя - я раз нарвался, теперь, скорее всего, буду помнить - для остальных.
Last edited by IgorZ on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Удалён оверквотинг

Smitis
Posts: 1612
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 39 times

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

Post by Smitis »

Получилась некоторая избыточность с DeleteRegKeyEx и DeleteRegKey. Может лучше одну DeleteRegKey из которой сначала попытаться вызвать DeleteRegKeyExW, а если не получилось, то DeleteRegKeyW игнорируя AccessMask? А то для DeleteRegKeyEx сейчас возврат непонятный, то ли просто удалить не удалось (раздела нет), то ли функция не поддерживается и надо вызывать DeleteRegKey.
Разум когда-нибудь победит.

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

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

Post by Shmuel »

Smitis
Две функции сделаны, чтобы не изменять логику старой. Обе останутся.
Что касается win.DeleteRegKeyEx, то можно дифференцировать причину неудачи вторым возвращаемым значением, например числом 1 или 2. Можно и кодом ошибки Windows (кажется он всегда неотрицательный) и -1.
Высказывайтесь.

Smitis
Posts: 1612
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 39 times

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

Post by Smitis »

Намутили MS с этим WOW :facepalm:

Может для DeleteRegKeyEx в случае невозможности вызвать DeleteRegKeyExW возвращать nil?
Разум когда-нибудь победит.

Smitis
Posts: 1612
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 18 times
Been thanked: 39 times

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

Post by Smitis »

Shmuel wrote:Можно и кодом ошибки Windows (кажется он всегда неотрицательный) и -1.
Код ошибки только для одной функции как-то нелогично. Тогда уж для всех :) Например, переменная win.LastError
Разум когда-нибудь победит.

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

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

Post by Shmuel »

Smitis wrote: Может для DeleteRegKeyEx в случае невозможности вызвать DeleteRegKeyExW возвращать nil?
Не, это изощрение, проверять, что вернулось: nil или false. Путь лучше API будет тяжелее (возвращение двух значений), но прямолинейнее. Тем более, что это функция не частого применения. Ну, а если кого-то будет раздражать "тяжёлое" API, может легко сделать обёртку на Lua.
Smitis wrote: Код ошибки только для одной функции как-то нелогично. Тогда уж для всех
Значит просто 2 варианта второй возвращаемой величины. Ломку/развитие всего API сейчас делать не в планах.

Post Reply

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