far.Guids?

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

far.Guids?

Post by Smitis » Sat 19 Sep, 2015 14:30

Latest post of the previous page:

Ну вот, сбылась многолетняя мечта :) теперь есть таблица far.Guids
Спасибо!
Разум когда-нибудь победит.

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

far.Guids?

Post by Shmuel » Sat 19 Sep, 2015 14:58

Smitis wrote: Ну вот, сбылась многолетняя мечта
Лучше позже, чем никогда :)

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

far.Guids?

Post by John Doe » Mon 21 Sep, 2015 07:24

В таблице 44 гуида, а в DlgGuid.hpp ~83.
Это намеренно? (поимённо не сравнивал)

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

far.Guids?

Post by Shmuel » Mon 21 Sep, 2015 07:39

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: 11264
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 84 times

far.Guids?

Post by John Doe » Mon 21 Sep, 2015 07:52

44
Фар из ночных сборок, luamacro build 528

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

far.Guids?

Post by Shmuel » Mon 21 Sep, 2015 08:00

John Doe wrote: 44
Фар из ночных сборок, luamacro build 528
Специально сейчас скачал Far30b4423.x86.20150921.7z, запустил с новым профилем - 83.

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

far.Guids?

Post by John Doe » Mon 21 Sep, 2015 08:06

:facepalm:
Я дико извиняюсь, оказывается не отовсяду вывел свою табличку (

IgorZ
Posts: 461
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

far.Guids?

Post by IgorZ » Wed 11 May, 2016 12:26

Есть предложение: добавить таблицу far.Guids.Plugins. Это позволит не запоминать магические числа (правда, надо будет запомнить магические названия - или воспользоваться LuaExplorer-ом). Два варианта реализации:
  1. в _macroinit.lua добавить следующий код:
    1. local guids = {}-- таблица guid-ов плагинов
    2. for _,p in ipairs(far.GetPlugins()) do -- переберём все плагины
    3.   local Info = far.GetPluginInformation (p) -- информация о плагине
    4.   guids[Info.GInfo.Title] = win.Uuid(Info.GInfo.Guid) -- запомним guid
    5. end
    6. far.Guids.Plugins = guids
    У меня со 112 плагинами среднее время исполнения кода занимает 16мс.
    Преимущество: может сделать самостоятельно любой желающий.
    Недостаток: если это не сделано, а какой-то скрипт полагается на данную таблицу, будут проблемы.
  2. добавить этот код в LuaMacro.
    Преимущество: гарантия наличия данной таблицы.
    Недостаток: надо, чтобы Shmuel счёл это полезным, не вредным и нашёл время этим заняться - а со временем всяко бывает.

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

far.Guids?

Post by Shmuel » Wed 11 May, 2016 13:50

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

А вообще-то (как все знают) в Lua существует хороший механизм, называемый "модули". Одно из его достоинств - платишь только, если пользуешься. То-есть, например, установлен модуль, и он используется в некоторых макросах. Вот до тех пор, пока один из этих макросов реально не вызван, модуль не загружается.

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

far.Guids?

Post by John Doe » Wed 11 May, 2016 14:29

Можно сделать метатаблицей, чтобы запрос всей информациия выполнялся при первом реальном обращении.
Shmuel wrote: Но вижу и недостатки
Немаловажно и то, что состав плагинов может динамически меняться.

IgorZ
Posts: 461
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

far.Guids?

Post by IgorZ » Mon 16 May, 2016 04:54

Следующий вариант. С метатаблицей (кстати, что-то я раньше пренебрегал ими. А зря). Заодно автоматически решается проблема с добавленым новым плагином. По времени так же, но 15-20мс (на моей конфигурации) съедается только при первом обращении к элементу таблицы.
  1. local function _ind(tbl,idx)
  2. if not rawget(tbl,idx) then -- плагина с таким именем нет в таблице?
  3.   for _,p in ipairs(far.GetPlugins()) do -- переберём все плагины
  4.     local Info = far.GetPluginInformation(p).GInfo -- информация о плагине
  5.     tbl[Info.Title] = win.Uuid(Info.Guid):upper() -- запомним имя и guid
  6.   end
  7. end
  8. return rawget(tbl,idx) -- вернём плагин (или nil, если такого нет)
  9. end
  10. far.Guids.Plugins = setmetatable({}, {__index=_ind}) -- таблица guid-ов плагинов
Насчёт модулей. Первоначально я так себе и сделал, и пользовался в своих макросах, вызывающих плагины. Но данный вариант поудобнее, поскольку не требует отдельных телодвижений. Собственно, раньше я не предлагал подобного, поскольку не было очевидного места, куда бы приткнуть такую таблицу. Сейчас оно есть, вот я и вышел с предложением для тех, кого оно заинтересует. Хотя "искаропки" было бы лучше всего.

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

far.Guids?

Post by Shmuel » Mon 16 May, 2016 08:08

1. Это лишнее: if not rawget(tbl,idx) then -- плагина с таким именем нет в таблице?
2. В отличие от диалогов/меню самого Far, здесь нет гарантии, что 2 или больше плагина не имеют одинаковый Title, например, Calendar или HexEditor и т.д. В этом случае по имени будет доступен только один из них.
3. "В коробку" можно вставить, хотя я до сих пор не уверен, что надо. Мнения?

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

far.Guids?

Post by Smitis » Mon 16 May, 2016 08:15

А не проще ли создать статическую таблицу всех распространённых плагинов? Не так уж их много.
Но потом понадобится таблица гуидов диалогов плагинов, потом диалогов макросов...
Разум когда-нибудь победит.

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

far.Guids?

Post by Shmuel » Mon 16 May, 2016 08:22

Smitis wrote: А не проще ли создать статическую таблицу всех распространённых плагинов?
Решение с метатаблицей очень простое, большей простоты не надо. И оно более универсальное, чем то, что вы предлагаете.
Вопрос только в том, нужно ли это из коробки или же кому надо сам себе поставит в _macroinit.lua.

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

far.Guids?

Post by Smitis » Mon 16 May, 2016 08:50

Shmuel wrote:Решение с метатаблицей очень простое, большей простоты не надо. И оно более универсальное, чем то, что вы предлагаете.
Вопрос только в том, нужно ли это из коробки или же кому надо сам себе поставит в _macroinit.lua.
Не уверен на счёт универсальности. Если кому-то нужно для себя лично, достаточно macroinit. Если предполагается использование в публичных макросах, тогда надо делать доступным для всех. Но тогда мы приходим к
Shmuel wrote:Но вижу и недостатки, главный из которых, что, если предположить, что пользоваться будет каждый десятый, то 9 пользователей из 10 заплатят 16мс ни за что. 16 мс это конечно ерунда, но эти вещи имеют свойство накапливаться (обратный вариант пословицы "копейка рубль бережёт").
Предложение: делать модулем, только модуль должен быть в дистрибутиве, например, завести папку modules в папке плагина LuaMacro, поместить путь в package.path. Пока там будет только один модуль, но глядишь, ещё появятся.
Разум когда-нибудь победит.

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

far.Guids?

Post by Shmuel » Mon 16 May, 2016 08:59

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

IgorZ
Posts: 461
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

far.Guids?

Post by IgorZ » Tue 17 May, 2016 07:02

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" и т. д.

Post Reply

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