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

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

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

Postby 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. Macro { description="Find matching bracket - Forward";
  4.   area="Editor"; key="Ctrl[";
  5.   condition=Brackets.Exist; action=Brackets.SearchFwd;
  6. }
  7.  
  8. Macro { description="Find matching bracket - Backward";
  9.   area="Editor"; key="Ctrl]";
  10.   condition=Brackets.Exist; action=Brackets.SearchBack;
  11. }
  12.  
  13. Macro { description="Find & Select matching bracket - Forward";
  14.   area="Editor"; key="CtrlShift[";
  15.   condition=Brackets.Exist; action=Brackets.SelectFwd;
  16. }
  17.  
  18. Macro { description="Find & Select matching bracket - Backward";
  19.   area="Editor"; key="CtrlShift]";
  20.   condition=Brackets.Exist; action=Brackets.SelectBack;
  21. }
  22.  
  23. Macro { description="Brackets matching - Config";
  24.   area="Editor"; key="CtrlShiftM";
  25.   condition=Brackets.Exist; action=Brackets.config;
  26. }


Штатные макросы конечно ничем не хуже, но более громоздкие.

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 и

Postby SUSim » Thu 18 Apr, 2013 18:29

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

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

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

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

Postby Smitis » Thu 18 Apr, 2013 18:38

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

Для тех, кто не пользуется колорером :)
Разум когда-нибудь победит.

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

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

Postby John Doe » Thu 18 Apr, 2013 18:51

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

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

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

Postby HaRT » Thu 18 Apr, 2013 19:19

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

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

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

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


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

Who is online

Users browsing this forum: No registered users and 3 guests