Plugin.require — функция-враппер на замену Plugin.Call и др.

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

Re: Plugin.require — функция-враппер на замену Plugin.Call и

Post by John Doe »

Latest post of the previous page:

В комплект последней версии плагина ConsoleControl добавлен Lua-модуль, определяющий Lua-интерфейс плагина.

Интерфейс практически идентичен тому, который получается при использовании Plugin.require.
Но что характерно: сам модуль по размеру почти в 2 раза превышает размер (Plugin.require + Plugin.idByName).

А ведь Plugin.require можно использовать с десятком плагинов.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Plugin.require — функция-враппер на замену Plugin.Call и

Post by Max Rusov »

John Doe wrote:Но что характерно: сам модуль по размеру почти в 2 раза превышает размер (Plugin.require + Plugin.idByName)
Вы упускаете несколько важных моментов.

1. Инерфейсный модуль позволяет делать значительно больше чем просто перевызовы функций. См. например, ConsoleControl.WindowSizeDelta. Или пример из другого плагина (еще не опубликованного):

Code: Select all

MoreHistory.OpenFolderHistory = function(Filter, Group, Order, IncHidden)
  local M = mmode(3,1)
  Plugin.Call(PID, "OpenFolderHistory", Filter, Group, Order, IncHidden)
  mmode(3,M)
end
2. Интерфейсный модуль является одновременно документацией.

3. Про автодополнение уже говорил.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Plugin.require — функция-враппер на замену Plugin.Call и

Post by John Doe »

Почему же упускаю, я об этом думал.
1. Бесспорно
2. Да, но если не писать модуль, а просто перечислить функции с параметрами - всё будет ещё нагляднее
3. Нет, ответил в теме
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Plugin.require — функция-враппер на замену Plugin.Call и

Post by Max Rusov »

John Doe wrote:3. Нет, ответил в теме
Что "нет" ? Автодополнение работает, я постоянно пользуюсь. Хоть какой-то сервис, а то этот LUA вообще нифига не проверяет...
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Plugin.require — функция-враппер на замену Plugin.Call и

Post by John Doe »

А, в этом плане соглашусь.
Plugin.require заранее не знает что за функции предоставляет модуль.
Но можно было бы научить (при наличии поддержки со стороны плагина).

А вот так "документация", я считаю, намного нагляднее, чем размазанная в определениях по модулю:

И сам модуль можно "свернуть": http://forum.farmanager.com/viewtopic.p ... 51#p105951
(Необходимости в этом нет конечно, просто спортивный интерес.)
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Plugin.require — функция-враппер на замену Plugin.Call и

Post by John Doe »

В дистрибутиве фара есть плагин Brackets. Кто не в курсе:

Вот как могут выглядеть макросы для него при использовании Plugin.require:
  1. local Brackets = Plugin.require"Brackets"
  2.  
  3.  
  4.  
  5. Macro { description="Find matching bracket - Forward";
  6.  
  7.   area="Editor"; key="Ctrl[";
  8.  
  9.   condition=Brackets.Exist; action=Brackets.SearchFwd;
  10.  
  11. }
  12.  
  13.  
  14.  
  15. Macro { description="Find matching bracket - Backward";
  16.  
  17.   area="Editor"; key="Ctrl]";
  18.  
  19.   condition=Brackets.Exist; action=Brackets.SearchBack;
  20.  
  21. }
  22.  
  23.  
  24.  
  25. Macro { description="Find & Select matching bracket - Forward";
  26.  
  27.   area="Editor"; key="CtrlShift[";
  28.  
  29.   condition=Brackets.Exist; action=Brackets.SelectFwd;
  30.  
  31. }
  32.  
  33.  
  34.  
  35. Macro { description="Find & Select matching bracket - Backward";
  36.  
  37.   area="Editor"; key="CtrlShift]";
  38.  
  39.   condition=Brackets.Exist; action=Brackets.SelectBack;
  40.  
  41. }
  42.  
  43.  
  44.  
  45. Macro { description="Brackets matching - Config";
  46.  
  47.   area="Editor"; key="CtrlShiftM";
  48.  
  49.   condition=Brackets.Exist; action=Brackets.config;
  50.  
  51. }
Штатные макросы конечно ничем не хуже, но более громоздкие.
User avatar
SUSim
Posts: 1636
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: Plugin.require — функция-враппер на замену Plugin.Call и

Post by SUSim »

Более громоздки как таковые, а предложенный тут вариант + модуль запутаннее... :(

кстати , колорер стандартный теперь плагин, зачем теперь нужен этот Brackets?
SimSU ··· ·· -- ··· ··-
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Plugin.require — функция-враппер на замену Plugin.Call и

Post by Smitis »

SUSim wrote:кстати , колорер стандартный теперь плагин, зачем теперь нужен этот Brackets?
Для тех, кто не пользуется колорером :)
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Plugin.require — функция-враппер на замену Plugin.Call и

Post by John Doe »

SUSim wrote:Более громоздки как таковые, а предложенный тут вариант + модуль запутаннее... :(
Путаница она в головах.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Re: Plugin.require — функция-враппер на замену Plugin.Call и

Post by HaRT »

Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Plugin.require — функция-враппер на замену Plugin.Call и др.

Post by John Doe »

В соседней теме вспомнили про данный скрипт.
С момента публикации я ещё несколько раз возвращался к экспериментам с ним.

Последний вариант называется 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.
Писалось давно, подозреваю потенциал совершенствования не исчерпан)
Post Reply

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