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

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

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

Post by John Doe » Thu 18 Apr, 2013 16:03

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: 1471
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 4 times
Been thanked: 3 times

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

Post by SUSim » Thu 18 Apr, 2013 18:29

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

кстати , колорер стандартный теперь плагин, зачем теперь нужен этот Brackets?
SimSU ··· ·· -- ··· ··-

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

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

Post by Smitis » Thu 18 Apr, 2013 18:38

SUSim wrote:кстати , колорер стандартный теперь плагин, зачем теперь нужен этот Brackets?
Для тех, кто не пользуется колорером :)
Разум когда-нибудь победит.

User avatar
John Doe
Бюрократ
Posts: 11074
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

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

Post by John Doe » Thu 18 Apr, 2013 18:51

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

User avatar
HaRT
Moderator
Posts: 7979
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 66 times
Been thanked: 97 times

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

Post by HaRT » Thu 18 Apr, 2013 19:19

Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 11074
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

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

Post by John Doe » Thu 26 May, 2016 09:53

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

Последний вариант называется 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 “Обсуждение макросов”

Who is online

Users browsing this forum: No registered users and 5 guests