В
соседней теме вспомнили про данный скрипт.
С момента публикации я ещё несколько раз возвращался к экспериментам с ним.
Последний вариант называется
getplugin.lua и выглядит так:
Code: Select all
local function checkArg(arg,argtype)
if not arg or type(arg)~=argtype then
error(("error in args: %s expected"):format(argtype))
end
return arg
end
local function IdByName(name)
checkArg(name,"string")
for _,p in ipairs(far.GetPlugins()) do
local Info = far.GetPluginInformation (p)
if Info.GInfo.Title==name or Info.ModuleName:find(name.."%.dll$") then
return win.Uuid(Info.GInfo.Guid):upper()
end
end
end
local std = {Call=1,SyncCall=1,Command=1,Config=1,Exist=1,Menu=1}
local plugs = setmetatable({},{__mode="v"})
local names = setmetatable({},{__mode="k"})
local synccall = setmetatable({},{__mode="k"})
local mt = {__index = function(plg,cmd)
local call = synccall[plg] and Plugin.SyncCall or Plugin.Call
plg[cmd] =
std[cmd] and function(...) local id = plg.Id; return id and Plugin[cmd](id,...) end
or cmd=="isLoaded" and function() local id = plg.Id; return id and far.IsPluginLoaded(id) end
--or cmd=="getHandle" and function() local id = plg.Id; return id and far.FindPlugin(far.Flags.PFM_GUID,win.Uuid(id)) end
or cmd~="Id" and function(...) local id = plg.Id; return id and call(id,cmd,...) end
or IdByName(names[plg])
return rawget(plg,cmd)
end}
local function getPlugByName(name,syncmode)
checkArg(name,"string")
local plg = plugs[name]
if not plg then
plg = {}; names[plg] = name; synccall[plg] = syncmode --!!syncmode is cached too
plugs[name] = setmetatable(plg,mt)
end
return plg
end
if ... then return getPlugByName end
P.S.
Писалось давно, подозреваю потенциал совершенствования не исчерпан)