far.Guids?

Здесь обсуждается всё, что касается макросов.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

far.Guids?

Post by Smitis »

Latest post of the previous page:

Ну вот, сбылась многолетняя мечта :) теперь есть таблица far.Guids
Спасибо!
Разум когда-нибудь победит.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

far.Guids?

Post by Shmuel »

Smitis wrote: Ну вот, сбылась многолетняя мечта
Лучше позже, чем никогда :)
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

far.Guids?

Post by John Doe »

В таблице 44 гуида, а в DlgGuid.hpp ~83.
Это намеренно? (поимённо не сравнивал)
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

far.Guids?

Post by Shmuel »

John Doe wrote: В таблице 44 гуида, а в DlgGuid.hpp ~83.
Это намеренно? (поимённо не сравнивал)
lua: n=0 for k in pairs(far.Guids) do n=n+1 end far.Show(n)
У меня показывает 83.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

far.Guids?

Post by John Doe »

44
Фар из ночных сборок, luamacro build 528
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

far.Guids?

Post by Shmuel »

John Doe wrote: 44
Фар из ночных сборок, luamacro build 528
Специально сейчас скачал Far30b4423.x86.20150921.7z, запустил с новым профилем - 83.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

far.Guids?

Post by John Doe »

:facepalm:
Я дико извиняюсь, оказывается не отовсяду вывел свою табличку (
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

far.Guids?

Post by IgorZ »

Есть предложение: добавить таблицу far.Guids.Plugins. Это позволит не запоминать магические числа (правда, надо будет запомнить магические названия - или воспользоваться LuaExplorer-ом). Два варианта реализации:
  1. в _macroinit.lua добавить следующий код:
    1. local guids = {}-- таблица guid-ов плагинов
    2.  
    3. for _,p in ipairs(far.GetPlugins()) do -- переберём все плагины
    4.  
    5.   local Info = far.GetPluginInformation (p) -- информация о плагине
    6.  
    7.   guids[Info.GInfo.Title] = win.Uuid(Info.GInfo.Guid) -- запомним guid
    8.  
    9. end
    10.  
    11. far.Guids.Plugins = guids
    У меня со 112 плагинами среднее время исполнения кода занимает 16мс.
    Преимущество: может сделать самостоятельно любой желающий.
    Недостаток: если это не сделано, а какой-то скрипт полагается на данную таблицу, будут проблемы.
  2. добавить этот код в LuaMacro.
    Преимущество: гарантия наличия данной таблицы.
    Недостаток: надо, чтобы Shmuel счёл это полезным, не вредным и нашёл время этим заняться - а со временем всяко бывает.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

far.Guids?

Post by Shmuel »

IgorZ wrote: Недостаток: надо, чтобы Shmuel счёл это полезным, не вредным и нашёл время этим заняться - а со временем всяко бывает.
Это полезно для тех, кто этим будет пользоваться. Времени это добавить - всего ничего.
Но вижу и недостатки, главный из которых, что, если предположить, что пользоваться будет каждый десятый, то 9 пользователей из 10 заплатят 16мс ни за что. 16 мс это конечно ерунда, но эти вещи имеют свойство накапливаться (обратный вариант пословицы "копейка рубль бережёт").

А вообще-то (как все знают) в Lua существует хороший механизм, называемый "модули". Одно из его достоинств - платишь только, если пользуешься. То-есть, например, установлен модуль, и он используется в некоторых макросах. Вот до тех пор, пока один из этих макросов реально не вызван, модуль не загружается.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

far.Guids?

Post by John Doe »

Можно сделать метатаблицей, чтобы запрос всей информациия выполнялся при первом реальном обращении.
Shmuel wrote: Но вижу и недостатки
Немаловажно и то, что состав плагинов может динамически меняться.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

far.Guids?

Post by IgorZ »

Следующий вариант. С метатаблицей (кстати, что-то я раньше пренебрегал ими. А зря). Заодно автоматически решается проблема с добавленым новым плагином. По времени так же, но 15-20мс (на моей конфигурации) съедается только при первом обращении к элементу таблицы.
  1. local function _ind(tbl,idx)
  2.  
  3. if not rawget(tbl,idx) then -- плагина с таким именем нет в таблице?
  4.  
  5.   for _,p in ipairs(far.GetPlugins()) do -- переберём все плагины
  6.  
  7.     local Info = far.GetPluginInformation(p).GInfo -- информация о плагине
  8.  
  9.     tbl[Info.Title] = win.Uuid(Info.Guid):upper() -- запомним имя и guid
  10.  
  11.   end
  12.  
  13. end
  14.  
  15. return rawget(tbl,idx) -- вернём плагин (или nil, если такого нет)
  16.  
  17. end
  18.  
  19. far.Guids.Plugins = setmetatable({}, {__index=_ind}) -- таблица guid-ов плагинов
Насчёт модулей. Первоначально я так себе и сделал, и пользовался в своих макросах, вызывающих плагины. Но данный вариант поудобнее, поскольку не требует отдельных телодвижений. Собственно, раньше я не предлагал подобного, поскольку не было очевидного места, куда бы приткнуть такую таблицу. Сейчас оно есть, вот я и вышел с предложением для тех, кого оно заинтересует. Хотя "искаропки" было бы лучше всего.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

far.Guids?

Post by Shmuel »

1. Это лишнее: if not rawget(tbl,idx) then -- плагина с таким именем нет в таблице?
2. В отличие от диалогов/меню самого Far, здесь нет гарантии, что 2 или больше плагина не имеют одинаковый Title, например, Calendar или HexEditor и т.д. В этом случае по имени будет доступен только один из них.
3. "В коробку" можно вставить, хотя я до сих пор не уверен, что надо. Мнения?
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

far.Guids?

Post by Smitis »

А не проще ли создать статическую таблицу всех распространённых плагинов? Не так уж их много.
Но потом понадобится таблица гуидов диалогов плагинов, потом диалогов макросов...
Разум когда-нибудь победит.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

far.Guids?

Post by Shmuel »

Smitis wrote: А не проще ли создать статическую таблицу всех распространённых плагинов?
Решение с метатаблицей очень простое, большей простоты не надо. И оно более универсальное, чем то, что вы предлагаете.
Вопрос только в том, нужно ли это из коробки или же кому надо сам себе поставит в _macroinit.lua.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

far.Guids?

Post by Smitis »

Shmuel wrote:Решение с метатаблицей очень простое, большей простоты не надо. И оно более универсальное, чем то, что вы предлагаете.
Вопрос только в том, нужно ли это из коробки или же кому надо сам себе поставит в _macroinit.lua.
Не уверен на счёт универсальности. Если кому-то нужно для себя лично, достаточно macroinit. Если предполагается использование в публичных макросах, тогда надо делать доступным для всех. Но тогда мы приходим к
Shmuel wrote:Но вижу и недостатки, главный из которых, что, если предположить, что пользоваться будет каждый десятый, то 9 пользователей из 10 заплатят 16мс ни за что. 16 мс это конечно ерунда, но эти вещи имеют свойство накапливаться (обратный вариант пословицы "копейка рубль бережёт").
Предложение: делать модулем, только модуль должен быть в дистрибутиве, например, завести папку modules в папке плагина LuaMacro, поместить путь в package.path. Пока там будет только один модуль, но глядишь, ещё появятся.
Разум когда-нибудь победит.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

far.Guids?

Post by Shmuel »

Smitis wrote:Но тогда мы приходим к
Shmuel wrote:Но вижу и недостатки, главный из которых, что, если предположить, что пользоваться будет каждый десятый, то 9 пользователей из 10 заплатят 16мс ни за что.
В варианте с метатаблицей платит (16 ms или сколько там получится) только тот, кто пользуется.
Post Reply

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