Каждый автор так или иначе снабжает свои скрипты метаинформацией, такой как название, описание, версия, автор, тема обсуждения на форуме, и т. п.
Сейчас эта информация может содержаться где угодно: в комментариях, или в каком-то диалоге, или в справке.
Естественно централизовано посмотреть её не получится.
Но раз каждый скрипт в любом случае содержит какую-то метаинформацию, то почему бы не заполнять её стандартизировано?
В результате мы получим возможность управлять скриптами централизованно, и реализовать разные интересные возможности, такие как изложенные ранее: http://forum.farmanager.com/viewtopic.p ... 66#p121966
Представляю экспериментальную реализацию некоторых идей:
Основные понятия:
Скрипт — это lua-файл. Он может содержать макросы или выполнять свои функции иным способом.
Скрипт может иметь вспомогательные файлы (cfg/lng/hlf).
Несколько скриптов могут формировать "пакет".
ScriptsBrowser.lua — утилита для работы со скриптами, запускается из меню плагинов.
main.png (24.01 KiB) Viewed 49890 times
sub-scripts.png (11.08 KiB) Viewed 49890 times
Info.png (20.01 KiB) Viewed 49890 times
help.png (25.7 KiB) Viewed 49890 times
regscript.lua — сам модуль, регистрирующий скрипты.
Должен быть подключен в _macroinit.lua: require"regscript"
Чтобы скрипт был зарегистрирован, он должен содержать примерно такой код:
local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info
local nfo = Info { _filename or ...,
name = "<name>";
id = "<unique id string>";
options = {a=1,b=2};
--etc
}
if not nfo then return nfo end
local O = nfo.options
Первая строка гарантирует что скрипт будет работать и без модуля регистрации. ... не просто троеточие, а выражение vararg, в данном случае позволяющее передать имя текущего файла.
Две последние строки тоже важны:
- проверка результата регистрации скрипта позволяет запретить выполнение (в случае несоответствия minfarversion, или когда его выполнение отключено другим образом)
- хранение собственных опций в таблице позволяет изменять их на лету в интерфейсе ScriptsBrowser а также переопределять их начальные значения (см. описание cfgscript.lua)
Все поля на данный момент опциональны, и их список открыт для обсуждения.
Пока предлагаю следующие:
name = "module: regscript.lua";
description = "collects metadata of luamacro scripts";
version = "0.1.1-alpha"; --в формате semver: http://semver.org/lang/ru/
author = "jd";
url = "http://forum.farmanager.com/viewtopic.php?p=121966#p121966";
id = "15660DC2-AE3F-41EE-8057-DC7428195908";
parent_id = ""; --id родительского скрипта
minfarversion = {3,0,0,4743,0}; --при несоответствии скрипт завершится
files = ""; --вспомогательные файлы скрипта
config = function(nfo,name) end; --функция конфигурации
help = function(nfo,name) end; --функция справки
execute = function(nfo,name) end; --функция исполняемая при запуске из ScriptBrowser
options = {}; --таблица с произвольными опциями скрипта
disabled = false; --запрет выполнения скрипта (см. ниже cfgscript.lua)
files
Задавая в поле files вспомогательные файлы скрипта, можно указывать абсолютный путь или путь относительно скрипта.
Поддерживаются переменные окружения.
Путь к Macros\scripts можно задать как ~\.
Шаблон * позволяет подставить имя скрипта, например files = "*_en.hlf;*_ru.hlf;"
options
Таблица с опциями, с указанием значений по-умолчанию. Смысл таблицы в том, что перечисленные опции можно изменить из браузера, а также переназначить во внешнем файле (см. cfgscript.lua)
функции
При запуске получают два аргумента: таблицу информации, и собственное имя в ней
Кроме того несколько полей зарезервированы для внутреннего использования: index, FileName, error, cfg.
Поле error создаётся в случае когда при загрузке обнаружены некорректные данные.
В том числе проверяются типы значений (добавляются только корректные поля).
cfgscript.lua — вспомогательный модуль, позволяющий переопределить начальные настройки скриптов не трогая их исходный код.
Настройки могут читаться либо из базы luamacro (уже работает, но ещё не реализован интерфейс для их записи), либо из заданного файла.
Чтобы прочитать их из файла, следует в _macroinit.lua поместить следующую команду: require"regscript".cfgload(fullpath)
Если fullpath не задан то используется файл Macros\scripts\scriptscfg.
Формат файла такой:
Параметр id обязателен.
Параметр disabled позволяет "отключить" скрипт.
Параметр options позволяет (пере)определить произвольные начальные опции.
Реальные примеры см. в scriptscfg.sample
cfgscript_test.lua — демонстрационный скрипт для иллюстрации того, что регистрация может быть полезна и в произвольных скриптах
Т.е. регистрировать можно не только макрофайлы из scripts, но и модули из modules, и вообще любые скрипты, например запускаемые из командной строки: lua:cfgscript_test.lua
InsertInfo.lua — вспомогательный макрос для вставки в скрипт шаблона с метаинформацией.
P.S.
Интерфейс самого модуля может быть интересен для применения в макробраузерах.
Сейчас он позволяет получить таблицу скрипта по индексу, по id, или по полному имени файла.
Столкнулся с проблемкой.
В редакторе options есть возможность удалить параметр. Но нет возможности сбросить на "умолчательное" значение (или я не нашёл). Было бы правильным при удалении параметра на самом деле не удалять его (что может привести к неработоспособности скрипта), а вернуть умолчательное значение. Можно, конечно, его вести снова, но надо же помнить имя! Т.е., если случайно удалили и lua не знаю, то до свидания любимы скрипт...
На самом деле я не проверял, возможно, для скрипта значение для удалённого параметра будет браться из текста. Но это не исправляет того факта, что поменять его из ScriptsBrowser-а будет невозможно, пока не заведёшь снова. Надо бы сделать "сброс" (пусть для всех параметров)...
HaRT wrote: ↑Wed 02 Oct, 2019 23:59
Ну я же написал: оно не для того, чтобы редактировать, а наоборот, для того, чтобы каждый раз при обновлении НЕ редактировать. Ну прочитайте же про cfgscript в шапке темы про ScriptBrowser.
Я на самом деле надеялся, что при выходе из редактора актуальные значения запоминаются в базе (как mf.mSave). Но я всё равно не понял. В описании cfgscript описан файл с настройками. Так что, его надо ручками править? Некузяво как-то...
Ладо, будет время - разъясните мне, бестолковому, как поменять такую настройку так, чтоб сам файл макроса не менялся. Не будет - не страшно. Меня и "3" устраивает...
buniak_a_h wrote: ↑Thu 03 Oct, 2019 00:32
В описании cfgscript описан файл с настройками. Так что, его надо ручками править?
В комплекте есть вспомогательный макрос для вставки шаблона в файл scriptscfg, но это действительно не слишком удобно.
Более удобная функция так и осталась в ScriptsBrowser нереализованной:
По замыслу, нажатие Shift+F4 должно открывать в редакторе файл настроек scriptscfg в нужном месте, если настройки нужного скрипта там уже присутствуют.
Если нет - то вставлять шаблон в конец файла.
╔════════════════════════════════════════════════════════════ Error ═════════════════════════════════════════════════════════════╗
║ C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.dll: ║
║ ...Profile\Macros\scripts\ScriptsBrowser\scriptsbrowser.lua:661: attempt to index local 'item' (a nil value) ║
║ stack traceback: ║
║ ...Profile\Macros\scripts\ScriptsBrowser\scriptsbrowser.lua:661: in function 'showList' ║
║ ...Profile\Macros\scripts\ScriptsBrowser\scriptsbrowser.lua:715: in function 'action' ║
║ C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.lua:479: in function <C:\Program Files\Far Manager\Plugins\LuaMacro\ ║
║ LuaMacro.lua:428> ║
╟────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║ { OK } ║
╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Скрипт становится неработоспособным до перезагрузки макросов (исчезает из меню плагинов)
FAR 5579 x64
Что-то раньше я этого не замечал…
John Doe wrote: ↑Thu 16 Apr, 2020 16:41
Да, было такое, у себя давно пофиксил
Возможно, те ошибочки, что я у себя тоже исправил, Вы давно пофиксили. Но всё же высылаю свой вариант.
Что вылезло:
--
Допустим, в строке files (в анализируемом скрипте) указано files = [[%FARPROFILE%\macros\modules\BAX\BaxUtils.lua,%FARPROFILE%\macros\modules\BAX\TmpPanelUtils.lua,%FARPROFILE%\macros\modules\BAX\GetMsg.lua,CopySelectedToTempPanel*.lng]];
По этой строке вылезло 2 ошибки:
1. Из-за того, что начальное значение переменной pos = 0, последняя буква (a) первого файла вылезает, как будто это - отдельный файл (с именем a);
2. Замена звёздочки в последнем имени на имя файла-скрипта приводит к дикому имени CopySelectedToTempPanelCopySelectedToTempPanel.lng (имя файла повторяется). Возможно, я неправильно использую эту фичу
--
Вылетало у меня в строке 695: local Items = scripts and prepItems(scripts,nil,sortName,root) or {}
Как выяснилось, sortname иногда == nil
----
Исправленный скрипт во вложении. Мои изменения помечены комментарием -- BAX и дата.
buniak_a_h wrote: ↑Mon 11 Jan, 2021 03:35
Замена звёздочки в последнем имени на имя файла-скрипта приводит к дикому имени CopySelectedToTempPanelCopySelectedToTempPanel.lng (имя файла повторяется). Возможно, я неправильно использую эту фичу
Звёздочка действительно меняется на имя, как и заявлено в описании. Вам вероятно требовалось что-то типа *_ru.lng;*_en.lng.
Т.е. в этом исправлении смысла не вижу:
John Doe wrote: ↑Mon 11 Jan, 2021 12:34
Вам вероятно требовалось что-то типа *_ru.lng;*_en.lng.
Это получается ограничение (только ru и en). А как у меня написано было (CopySelectedToTempPanel*.lng) - на язык ограничений не накладывает. Зато накладывает ограничение на начало имени. Поэтому хотелось бы, чтоб можно было указать так: %n*.lng
Вместо %n чтоб подставилось FileName без расширения. А при AltF4 - чтоб ещё одно меню вылезало со списком файлов, соответствующих маске. Мысль только что пришла в голову, наверно, замакросю.
John Doe wrote: ↑Mon 11 Jan, 2021 12:34
меняется на имя, как и заявлено в описании
Вот как раз с этим у меня проблема. Не нашёл описания. Ориентировался только на комментарии примера, что в первом сообщении под спойлером. Где можно посмотреть описание?
buniak_a_h wrote: ↑Mon 11 Jan, 2021 14:34
Поэтому хотелось бы, чтоб можно было указать так:
%n*.lng
Вместо %n чтоб подставилось FileName без расширения.
Маски не предусмотрены идеологически, предполагается что файлы перечислены поимённо.
(Об масках в своё время думал, и решил что сомнительное удобство тут не окупает потенциальные неоднозначности).
buniak_a_h wrote: ↑Mon 11 Jan, 2021 14:34
Не нашёл описания.
buniak_a_h wrote: ↑Mon 11 Jan, 2021 03:35
1. Из-за того, что начальное значение переменной pos = 0, последняя буква (a) первого файла вылезает, как будто это - отдельный файл (с именем a);
buniak_a_h wrote: ↑Mon 11 Jan, 2021 03:35
Как выяснилось, sortname иногда == nil
У меня не падает с nil.
Научите как воспроизвести.
Было при первом вызове браузера . Давно не повторялось (т.к. исправил), поэтому подробностей не помню. Просто знаю, что я достаточно ленив, чтоб не делать лишнее. А раз сделал, значит была нужда.
P/S. Возможно (теперь уже не помню), сделано было чтобы при первом показе сортировалось (была определённость). А то найти свой скрипт в случайном списке трудно.
John Doe wrote: ↑Mon 11 Jan, 2021 15:42
Сделаю "по имени" (но в другом месте)
Вам виднее. Спасибо. Если (как говорил мой начальник) есть много лишнего времени, то было бы кузяво сделать настройку. Начальная сортировка по автору тоже была бы полезна. С запоминанием позиционирования. А если браузер открывается из редактора, в редакторе открыт скрипт и он есть в списке - позиционироваться сразу на нём Но это - если много лишнеговремени.