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:

В дистрибутиве фара есть плагин 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 “Обсуждение макросов”