Менеджер Lua-скриптов для Farа

Здесь выкладываются готовые к использованию макросы и скрипты.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

Выводит список всех Lua-скриптов Farа и позволяет манипулировать ими.









Требуемая версия Far 3.0.5210+.

Начиная с версии 4.0, скрипт выполнен в виде модуля и набора вызывающих макросов.

Attachments
LuaManager.6.0.2.7z
Версия для Far 3.0.0.5934+
(65.47 KiB) Downloaded 88 times
LuaManager.5.2.0.7z
Версия для Far 3.0.0.5210+
(58.78 KiB) Downloaded 219 times
LuaManager.5.0.6.7z
Последняя опубликованная версия, поддерживающая Far 3.0.0.4000 и выше
(59.02 KiB) Downloaded 351 times
LuaManager.3.1.11.7z
Последняя версия, выполненная не в виде модуля
(50.56 KiB) Downloaded 515 times
Last edited by IgorZ on Wed 25 Oct, 2023 10:02, edited 24 times in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

Latest post of the previous page:

IgorZ wrote: Если подумать, проблема может возникнуть, если выгрузить такой модуль, а потом снова вызвать его по require.
Это фантастическая ситуация. Но есть package.preload, где кстати загрузчики по имени индексируются, что избавляет от необходимости в хитрых проверках с использованием debug.
IgorZ wrote: Так что отдельный загрузчик всё-таки наименее проблемен, судя по моему опыту.
Наименее проблемно положить модуль в соответствующую папку. И ни один из других способов не позволит загрузить модуль, если он востребован до загрузки скрипта из scripts (как известно порядок загрузки макросов не определён).

Если же игнорировать эту проблему, то проще всего прямо модифицировать package.loaded, имхо это всё равно лучше чем прочие предложенные способы.

Но вот не знаю почему вы против размещения модуля в соответствующей папке.
Если уж так, то можно ведь и без модулей обойтись, одними макросами:

Code: Select all

Macro {
  area="Common"; key="luamanager";
  action=function() return ManageMacrosEvents end;
}
Вызывать так: local res,luamanager = mf.eval("luamanager",2)
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Менеджер Lua-скриптов для Farа

Post by Smitis »

IgorZ wrote:
zg wrote:вариант с таблицей - быстрее.
*занудным голосом* ООП - не для скорости, ООП - для идеологической чистоты и удобства использования старых ошибок при написании.
Можно сделать и таблицей, точнее таблицами - метатаблицу сделать отдельно от таблицы-класса, т.е. __index из метатаблицы будет указывать на таблицу-класс. Скорость не упадёт, наследование станет ещё более изощрённым, но это решит проблему только с моими скриптами и не спасёт ситуацию в целом.
Разум когда-нибудь победит.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

Версия 3.1.6 - В окне просмотра выводимые значения сортируются по типам и именам и не зацикливаются. Проверено на том самом DialogClass. Ссылки на таблицы отображаются "->" или "-^" (для рекурсивных). Рефакторинг.
John Doe wrote:Наименее проблемно положить модуль в соответствующую папку. И ни один из других способов не позволит загрузить модуль, если он востребован до загрузки скрипта из scripts (как известно порядок загрузки макросов не определён).
В смысле, кто-то попытается обратиться к чисто интерактивному скрипту, по определению запускаемому, когда все остальные скрипты уже загружены, в автозагрузке? Прямо в _macroinit.lua, к примеру? Вот честно, не представляю себе такой вариант использования. А если кому-то всё же понадобится, можно воспользоваться mf.postmacro(function() require"LuaManager"() end) - как раз дождётся загрузки всего того, с чем работает, и запустится. Проверил, всё тип-топ.
John Doe wrote:Но вот не знаю почему вы против размещения модуля в соответствующей папке.
Языковые файлы, настройки. Я пробовал. Прикинул, сколько придётся переделывать, и какие костыли лепить, и передумал.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

IgorZ wrote: В смысле, кто-то попытается обратиться к чисто интерактивному скрипту, по определению запускаемому, когда все остальные скрипты уже загружены, в автозагрузке?
Именно обратиться, а не запустить.
Например если какой-то скрипт будет содержать в начале local luamanager = require "luamanager"
IgorZ wrote: Языковые файлы, настройки. Я пробовал. Прикинул, сколько придётся переделывать, и какие костыли лепить, и передумал.
Честный модуль может обращаться к своим файлам через require.
Впрочем, несложно получить и полный путь файла модуля.

Собственно я сейчас не агитирую вас заниматься этим, а лишь обращаю внимание что подход с добавлением собственного загрузчика (и особенно манипуляции по его восстановлению после перезагрузки макросов) это совсем уж overkill
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

John Doe wrote:
IgorZ wrote: В смысле, кто-то попытается обратиться к чисто интерактивному скрипту, по определению запускаемому, когда все остальные скрипты уже загружены, в автозагрузке?
Именно обратиться, а не запустить.
Например если какой-то скрипт будет содержать в начале local luamanager = require "luamanager"
Ладно, принимается. Буду иметь в виду, что надо бы что-то сделать - вдруг кто-то попробует реализовать и напорется.
John Doe wrote:Собственно я сейчас не агитирую вас заниматься этим, а лишь обращаю внимание что подход с добавлением собственного загрузчика (и особенно манипуляции по его восстановлению после перезагрузки макросов) это совсем уж overkill
Зато было интересно, и я получил новый опыт. :)
aflexus
Posts: 74
Joined: Sat 12 Mar, 2011 16:57
Has thanked: 23 times
Been thanked: 1 time

Менеджер Lua-скриптов для Farа

Post by aflexus »

IgorZ, а проблему с пропаданием меню под х64 так и не удалось решить?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

Понадобилось отфильтровать макросы по файлу, но почему-то не работает, список получается пуст

Code: Select all

╔═ Macros *. Events *. MenuItems. CommandLines. Mask: "*\smartsearch.lua". ══╗
╚═════ Enter,Esc,F1,F3,AltF3,F4,Alt/CtrlF4,Ins,Del,CtrlPgDn,CtrlR/D,F9 ══════╝
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

aflexus wrote:IgorZ, а проблему с пропаданием меню под х64 так и не удалось решить?
У меня только x32, так что проверить не могу.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

John Doe wrote:Понадобилось отфильтровать макросы по файлу, но почему-то не работает, список получается пуст

Code: Select all

╔═ Macros *. Events *. MenuItems. CommandLines. Mask: "*\smartsearch.lua". ══╗
╚═════ Enter,Esc,F1,F3,AltF3,F4,Alt/CtrlF4,Ins,Del,CtrlPgDn,CtrlR/D,F9 ══════╝
Вижу, там на макросы и эвенты ещё какие-то фильтры стоят. Возможно, это они отсекают содержимое данного файла?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

Ну так научите пользоваться.
Вызываю по инструкции require"LuaManager"{FFilter=script.FileName}
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

John Doe wrote:Ну так научите пользоваться.
Вызываю по инструкции require"LuaManager"{FFilter=script.FileName}
Указанные при вызове фильтры не отменяют сохранённых в конфигурации. Надо проверить
  • CtrlM - фильтр областей для макросов;
  • CtrlE - фильтр групп для эвентов;
  • CtrlShiftK - фильтр клавиш для макросов.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

IgorZ wrote:Указанные при вызове фильтры не отменяют сохранённых в конфигурации.
Кстати, надо, наверное, предусмотреть на такой случай поле навроде ResetFilters=true. Запишу себе в планы.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

Версия 3.1.7 - Добавлен модуль-заглушка на случай require"LuaManager" из _macroinit.lua. Если ни один из скриптов не делает require"LuaManager" в процессе загрузки, заглушка не нужна. Если делает, лучше положить её в Macros\modules во избежание ошибок при загрузке макросов. Сам по себе модуль-заглушка может лежать где угодно - он ничего не делает и, соответственно, никому не мешает. Главное, не перепутайте его с настоящим LuaManager.lua! В параметры, передаваемые модулю, включён ResetFilters: если истина, то перед применением параметров включить показ всего и сбросить все фильтры. Применять, если надо игнорировать параметры показа и фильтрации скриптов, сохранённые в БД.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

Code: Select all

for _,p in ipairs(far.GetPlugins()) do -- переберём все плагины
  local GInfo = far.GetPluginInformation(p).GInfo -- информация о плагине
  if GInfo.Title=="LuaMacro" then LMBuild = GInfo.Version[4] break end -- запомним версию LuaMacro
end
Этот код при определённых условиях вызывает ошибку.

far.GetPlugins может давать дескрипторы и уже выгруженных плагинов, если они выгружены не штатно а по исключению (может баг в фаре).
Поэтому надо проверять результат far.GetPluginInformation, прежде чем индексировать.

P.S.
Аналогичный код есть и в EnvManager и других скриптах того же автора
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Менеджер Lua-скриптов для Farа

Post by IgorZ »

Версия 3.1.8 - Изменён способ получения версии LuaMacro. Теперь можно редактировать несохранённые клавиатурные макросы. Модуль теперь возвращает таблицу функций (старый вариант вызова сохранён). Изменён способ регистрации модуля.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Менеджер Lua-скриптов для Farа

Post by John Doe »

IgorZ wrote: Изменён способ регистрации модуля.
Для данного случая более корректным будет такой модуль:

Code: Select all

--nfo skipped
--...
return setmetatable({},{
  __call = function(self,...) return self.Main(...) end;
  __index = function() far.Message("LuaManager not loaded yet") end;
})
Смысл: индексировать таблицу до фактической загрузки LuaManager нельзя, поэтому правильнее выводить сообщение об ошибке сразу, а не при попытке использования dummy-функции.

P.S.
Код иллюстрирует идею, и не тестировался, вероятно лучше что-то типа:

Code: Select all

  __index = function() return function() far.Message("LuaManager not loaded yet") end end;
[/s]
Хотя нет, скорее так

Code: Select all

  __index = function() error("LuaManager not loaded yet") end;
или так

Code: Select all

  __index = function() far.Message("LuaManager not loaded yet"); return function() end end;
Post Reply

Return to “Полезные макросы и скрипты”