far.Guids?

Здесь обсуждается всё, что касается макросов.
IgorZ
Posts: 417
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 4 times
Been thanked: 5 times

far.Guids?

Postby IgorZ » Tue 17 May, 2016 07:02

Latest post of the previous page:

Shmuel wrote:1. Это лишнее: if not rawget(tbl,idx) then -- плагина с таким именем нет в таблице?
Возможно, я не до конца понимаю суть метатаблиц? В моём понимании, функция _ind заменяет собой стандартный обработчик обращения к элементу таблицы по индексу (а rawgtet(tbl,idx) и есть стандартный обработчик). То есть, она исполняется каждый раз, когда кто-то пишет tbl[idx]. Но тогда и цикл должен исполняться при каждом таком обращении.
Проверил. Действительно, при комментировании условия всё равно задержка в 15-20мс происходит только при первом обращении после перезагрузки. И чего именно я не знаю?
Shmuel wrote:2. В отличие от диалогов/меню самого Far, здесь нет гарантии, что 2 или больше плагина не имеют одинаковый Title, например, Calendar или HexEditor и т.д. В этом случае по имени будет доступен только один из них.
Ну, теоретически, могут совпасть и 2 uid-а у разных плагинов (даже если не учитывать теорию вероятности, достаточно недобросовестного плагинописателя или какого-то любителя красивых цифр). А добросовестный автор постарается придумать уникальный Title по умолчанию. Так что с практической точки зрения, на мой взгляд, не страшно. Но если надо, могу попробовать добавить автоматическую дописывалку к названию суффиксов, к примеру, "_2", "_3" и т. д.

Shmuel
Posts: 4906
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 10 times
Been thanked: 118 times

far.Guids?

Postby Shmuel » Tue 17 May, 2016 13:01

IgorZ wrote:Source of the post И чего именно я не знаю?
Метаметод __index вызывается только если элемент с данным ключом в таблице отсутствует, поэтому дополнительная проверка внутри метаметода является излишней.

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

far.Guids?

Postby John Doe » Tue 17 May, 2016 13:06

IgorZ wrote:Source of the post Но если надо, могу попробовать добавить автоматическую дописывалку к названию суффиксов, к примеру, "_2", "_3" и т. д.
Точно не стоит.

IgorZ wrote:Source of the post А добросовестный автор постарается придумать уникальный Title по умолчанию.
Вероятность того, что у одного пользователя окажется установленным два плагина с одним именем, и к обоим он захочет обратиться через far.Guids невелика, и при необходимости может разрешится пользователем самостоятельно: прямым указанием гуида.

И всё же я не уверен в полезности этой функции "из коробки". Предвижу неочевидные последствия, навроде наивных попыток использовать таблицу гуидов как источник перечисления плагинов, и т.п.

IgorZ
Posts: 417
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 4 times
Been thanked: 5 times

far.Guids?

Postby IgorZ » Thu 26 May, 2016 06:32

Я тут среди своих залежей всякого разного нашёл когда-то скачанный Plugin.require авторства, если не ошибаюсь, JohnDoe. И скрестил со своим предложением. Вот что получилось:
Code: [Select all] [Expand/Collapse] [Download] (far.Guids.Plugins._macroinit_v3.lua)
  1. local function _ind(tbl,idx) -- таблица плагина
  2. --
  3. local function _fun(tbl,name) -- нестандартная функция плагина
  4. local callfun,callname -- имя функции и вызывающая функция (синхронная/асинхронная)
  5. if name:sub(1,4)=="Sync" then callfun,callname = "SyncCall",name:sub(5) else callfun,callname = "Call",name end
  6. tbl[name] = function(...) return Plugin[callfun](tbl.Id,callname, ...) end -- добавим функцию в таблицу
  7. return rawget(tbl,name) -- вернём функцию
  8. end
  9. --
  10. for _,p in ipairs(far.GetPlugins()) do -- переберём все плагины
  11.   local Info = far.GetPluginInformation(p).GInfo -- информация о плагине
  12.   local guid = win.Uuid(Info.Guid) -- guid плагина
  13.   tbl[Info.Title] = setmetatable({ -- таблица
  14.     Id = guid:upper(), -- guid
  15.     Call = function(...) return Plugin.Call(guid,...) end, -- стандартные функции
  16.     Command = function(...) return Plugin.Command(guid,...) end,
  17.     Config = function(...) return Plugin.Config(guid,...) end,
  18.     Exist = function(...) return Plugin.Exist(guid,...) end,
  19.     Menu = function(...) return Plugin.Menu(guid,...) end,
  20.     SyncCall = function(...) return Plugin.SyncCall(guid,...) end},{__index=_fun}) -- обработаем обращение к нестандартной функции
  21. end
  22. return rawget(tbl,idx) -- вернём плагин (или nil, если такого нет)
  23. end
  24. far.Guids.Plugins = setmetatable({}, {__index=_ind}) -- таблица guid-ов плагинов

Теперь можно писать следующее:
  1. local ConCtrl=far.Guids.Plugins["Console Control"]
  2.  
  3. if not ConCtrl.Exist() then
  4.   error("not exist plugin with guid '" ..(ConCtrl.Id or "nil").. "'")
  5. end
  6. -- для асинхронного вызова
  7. local x,y = ConCtrl.BufferSize()
  8. -- или для синхронного вызова
  9. local x,y = ConCtrl.SyncBufferSize()

Хотя это уже не только guid-ы, так что насчёт месторасположения таблицы возможны различные мнения.

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

far.Guids?

Postby John Doe » Thu 26 May, 2016 09:57

IgorZ wrote:Source of the post авторства, если не ошибаюсь, JohnDoe.
Было дело. Но с тех пор я ещё поразмышлял над эффективностью, и в частности об использовании памяти.


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

Who is online

Users browsing this forum: No registered users and 3 guests