Библиотека LuaFAR делает возможным написание плагинов на языке Lua, предоставляя им адаптированную версию FAR API.
Входит в состав FAR manager (начиная с 3.0 build 2851), и доступна для использования в макросах.
Справка по функциям библиотеки — luafar_manual.chm (в дистрибутиве, папка Encyclopedia).
Мануал весьма лаконичен, предполагает что вы ориентируетесь в FAR Plugins API (FarEncyclopedia.ru.chm, в дистрибутиве)
Дополнения к мануалу:
far.Menu: в описании приведена ссылка на статью Энциклопедии Виртуальные коды клавиш. Однако не все перечисленные там клавиши на самом деле обрабатываются фаром. В частности, в качестве BreakKey не могут выступать кнопки мыши.
John Doe wrote:Какие преимущества перед макросом могут сейчас быть у скрипта, оформленного как LuaFAR плагин? например
1. Независимость от системы макросов / плагина LuaMacro.
2. Возможность создавать панельные плагины. 3. Доступ к меню плагинов и меню конфигурации плагинов. (уже доступно и макросам)
Shmuel wrote:1. Независимость от системы макросов / плагина LuaMacro.
А когда может понадобиться такая независимость, учитывая что LuaMacro присутствует в дистрибутиве?
Или система макросов накладывает какие-то ограничения?
И не нашёл где взять. Ни в теме, ни на плагринге нет.
Shmuel wrote:1. Независимость от системы макросов / плагина LuaMacro.
А когда может понадобиться такая независимость, учитывая что LuaMacro присутствует в дистрибутиве?
Или система макросов накладывает какие-то ограничения?
И не нашёл где взять. Ни в теме, ни на плагринге нет.
Судя по тому, что doc и examples только на github я подумал что это основное место.
Но сейчас вижу, что тот репозиторий давно не обновлялся, и всё на farmanager.com
Кажется когда-то в дистрибутиве была некая универсальная dll (generic plugin)?
John Doe wrote:Кажется когда-то в дистрибутиве была некая универсальная dll (generic plugin)?
Generic plugin на месте - это файл luaplug.c. Он используется при сборке luamacro.dll - можете взять это как образец.
P.S. Если вы не хотите ничего собирать - возьмите luamacro.dll - он тоже "generic" и переименуйте в <plugname>.dll на ваш выбор. Далее создайте файлы <plugname>.lua и _globalinfo.lua.
Понятно, я думал что можно не собирать, а просто использовать одну и ту же dll для разных плагинов (переименовывая, и дополняя соответствующим скриптом)
Shmuel wrote:P.S. Если вы не хотите ничего собирать - возьмите luamacro.dll - он тоже "generic" и переименуйте в <plugname>.dll на ваш выбор. Далее создайте файлы <plugname>.lua и _globalinfo.lua.
Так и собирался, но насторожило что например fin.dll в 3 раза меньше luamacro.dll.
Видимо они просто по-разному собирались, и у luamacro нет зависимости от msvcrt.dll
-----------------------------------------------------------------------------
-- Name: FIN == "Fix Incorrect Names"
-- Started: 2010-08-26
-- Author: Shmuel Zeigerman
-- Original author of plugin in Pascal: Андрей Подлазов aka Тигрёнок.
-----------------------------------------------------------------------------
local Pattern = "%s+$"
local F = far.Flags
local SendDlgMessage = far.SendDlgMessage
local GUIDs = {
[win.Uuid("fcef11c4-5490-451d-8b4a-62fa03f52759")] = "CopyFilesId",
[win.Uuid("431a2f37-ac01-4ecd-bb6f-8cde584e5a03")] = "MoveFilesId",
[win.Uuid("1d07cee2-8f4f-480a-be93-069b4ff59a2b")] = "FileOpenCreateId",
[win.Uuid("9162f965-78b8-4476-98ac-d699e5b6afe7")] = "FileSaveAsId",
[win.Uuid("5eb266f4-980d-46af-b3d2-2c50e64bca81")] = "HardSymLinkId",
[win.Uuid("fad00dbe-3fff-4095-9232-e1cc70c67737")] = "MakeFolderId",
}
local function FIN (Event, FarDialogEvent)
if Event == F.DE_DLGPROCINIT and FarDialogEvent.Msg == F.DN_CLOSE
and FarDialogEvent.Param1 >= 0 then
local hDlg = FarDialogEvent.hDlg
local DialogInfo = SendDlgMessage(hDlg, "DM_GETDIALOGINFO")
if DialogInfo and GUIDs[DialogInfo.Id] then
for item = 0, 1e6 do
local FarDialogItem = SendDlgMessage(hDlg, "DM_GETDLGITEM", item)
if not FarDialogItem then break end
if FarDialogItem[1] == F.DI_EDIT then
local str, n = FarDialogItem[10]:gsub(Pattern, "")
if n > 0 then
SendDlgMessage(hDlg, "DM_SETTEXT", item, str)
end
break
end
end
end
end
end
Event {
description="Fix Incorrect Names";
group="DialogEvent";
action=FIN;
}
Вначале показалось что не работает.
На самом деле всё в порядке, просто удаление точек не предусмотрено: local Pattern = "%s+$"
Чтобы было как в исходном плагине можно сделать local Pattern = "[%s%.]+$"