[wish] Програмное добавление макросов (mf.AddMacro и др.)
Posted: Mon 27 Jan, 2014 14:17
by John Doe
Предполагается такое использование:
Динамическое добавление временных макросов
Нужен аналог far.MacroAdd, но поддерживающий возможности LuaMacro.
Т.е. допускающий использование upvalues, обрабатывающий клавиши заданные регекспами, и пр.
Расширение стандартного загрузчика макросов собственными функциями.
На форуме сейчас уже есть 3 скрипта, пытающихся расширять Macro (например rebind) , и будут ещё.
Приватная функция AddMacro из utils.lua почти полностью подходит под требования, но сейчас она в явном виде недоступна скриптам.
Известны такие способы получения доступа к этой функции:
получение функции из окружения скрипта
доступ с использованием отладочных функций debug
При этом возникают такие вопросы:
- функцию всё равно требуется где-то сохранить (в _G или в локальной переменной модуля)
- в сохранённой функции используется upvalue FileName, а значит что в дальнейшем при её использовании будет сохраняться неактуальное имя файла.
Предлагаю обсудить "легализацию" функции, ведь это позволит избавиться от вынужденно используемых хаков, а значит сделает мир чище.
Подобное обсуждалось в старых темах:
Re: [wish] Програмное добавление макросов (mf.AddMacro и др.
Posted: Mon 27 Jan, 2014 15:23
by Shmuel
Один товарищ (не помню сейчас его ник) усердно ратовал за это в форуме примерно год назад. Если этого ещё нет на мантисе - поместите туда.
[wish] Програмное добавление макросов (mf.AddMacro и др.
Posted: Mon 27 Jan, 2014 15:38
by John Doe
Собирался с этого начать, но в процессе составления описания осознал что большое количество нерешённых сопутствующих вопросов не дают чётко сформулировать тикет.
Например
- Как быть с FileName В актуальных версиях FullPath является вторым параметром функции AddRegularMacro (utils.lua)
- Стоит ли разрешить сохранять в таблице макроса другие поля, кроме жёстко определённых в utils.lua
- Для "временных" макросов актуален вопрос их удаления
- Стоит ли легализовать и переопределение стандартного загрузчика, чтобы убрать шаманство с upvalues Не стоит, см ниже http://forum.farmanager.com/viewtopic.p ... 47#p116247
Re: [wish] Програмное добавление макросов (mf.AddMacro и др.
Posted: Mon 27 Jan, 2014 15:47
by Shmuel
Да, здесь есть много вопросов: как взаимосвязанных, так и независимых друг от друга. Но это не значит, что нельзя открыть тикет на мантисе, обозначив в нём основную желаемую добавку функциональности. Вы не обязаны при этом заранее обозначать все детали.
Re: [wish] Програмное добавление макросов (mf.AddMacro и др.
Posted: Mon 27 Jan, 2014 16:09
by John Doe
Не хотелось бы формулировать тикет в совсем уж общем виде.
А для обсуждения форум намного удобнее.
Возможно у кого-то есть свежие мысли, или альтернативное видение вопроса.
Тикет разумеется открою, вначале только ещё раз всё обдумаю.
[wish] Програмное добавление макросов (mf.AddMacro и др.
Posted: Tue 28 Jan, 2014 13:12
by John Doe
John Doe wrote:- Стоит ли легализовать и переопределение стандартного загрузчика, чтобы убрать шаманство с upvalues
Подумалось, что можно полностью переопределить стандартный загрузчик и без использования функций debug.
За поиск и загрузку макрофайлов отвечает рекурсивно вызываемая функция LoadOneFile LoadRegularFile (utils.lua).
Она достаточно проста, а значит чтобы реализовать собственную загрузку макросов достаточно поместить подобную функцию в _macroinit.lua (пример).
Затем надо как-то завершить стандартный загрузчик, чтобы он не пытался грузить ничего кроме _macroinit.lua.
Для этого удобнее всего будет использовать возвращаемое значение скрипта.
(альтернативно workaround: грузить скрипты не из Macros\scripts)
И остаются уже упомянутые выше вопросы.
- как сохранить дополнительные значения в таблице макроса, или как получить прямой доступ к ней (GetMacroById) - как передать имя файла не используя upvalue AddMacro_filename (надо предусмотреть интерфейс в mf.AddMacro)
- как удалять макросы (workaround: поле disable в таблице макроса)
Re: [wish] Програмное добавление макросов (mf.AddMacro и др.
Posted: Wed 29 Jan, 2014 16:17
by John Doe
John Doe wrote:- как сохранить дополнительные значения в таблице макроса, или как получить прямой доступ к ней (GetMacroById)
- как передать имя файла не используя upvalue AddMacro_filename (надо предусмотреть интерфейс в mf.AddMacro)
- как удалять макросы (workaround: поле disable в таблице макроса)
mf.GetMacroCopy возвращает копию таблицы макроса, а значит нет возможности изменить и (потенциально) испортить исходную таблицу.
Имхо это перестраховка, и ничего страшного не произойдёт, если заменить эту функцию на GetMacroById (utils.lua)
Если всё же перестраховываться, то можно поступить иначе: исходная таблица может быть возвращаемым значением mf.AddMacro/Event
(в этом случае доступ к ней будет только у макро загрузчика).
Хотя на данный момент единственное поле таблицы, которое имеет смысл изменять - это disabled, и для управления им достаточно выделить специальную функцию.
Если так, то строго говоря необходимости лезть во внутреннюю таблицу макроса нет.
Однако возможность держать дополнительные данные в таблице была бы удобна, т.к. в этом случае они автоматически доступны по mf.GetMacroCopy (т.е. отпадает необходимость выдумывать собственные функции для предоставления доступа к данным)
Просто так добавить свои поля в определение макроса мы не можем, т.к. стандартный загрузчик фильтрует входные данные.
Не то чтобы это было необходимо, но логика в этом есть.
Как вариант, можно снабдить mf.AddMacro вторым аргументом, в котором и передавать таблицей нужные нам дополнительные поля.
Вместо AddMacro_filename можно использовать поле FileName (или передавать третьим аргументом)
Re: [wish] Програмное добавление макросов (mf.AddMacro и др.
Posted: Tue 17 Jun, 2014 14:00
by John Doe
Вызов Macro{} теперь возвращает внутреннюю таблицу макроса.
Можно уже на это полагаться, или всё ещё может поменяться?
С Event{} будет аналогично?
Re: [wish] Програмное добавление макросов (mf.AddMacro и др.
Posted: Tue 17 Jun, 2014 14:14
by Skirda
Потом надо Far Manager переименовать в Far Artificial Life (судя по хотелке). Не?
Re: [wish] Програмное добавление макросов (mf.AddMacro и др.
Posted: Tue 17 Jun, 2014 14:44
by Shmuel
John Doe wrote:Вызов Macro{} теперь возвращает внутреннюю таблицу макроса.
Можно уже на это полагаться, или всё ещё может поменяться?
Это по недосмотру. Спасибо за репорт.
Re: [wish] Програмное добавление макросов (mf.AddMacro и др.
Posted: Tue 17 Jun, 2014 14:45
by John Doe
Эх, а я уже начал пользоваться )
[wish] Програмное добавление макросов (mf.AddMacro и др.)
Posted: Thu 14 Jul, 2016 22:23
by John Doe
John Doe wrote: Подумалось, что можно полностью переопределить стандартный загрузчик и без использования функций debug.
За поиск и загрузку макрофайлов отвечает рекурсивно вызываемая функция LoadRegularFile (utils.lua).
Она достаточно проста, а значит чтобы реализовать собственную загрузку макросов достаточно поместить подобную функцию в _macroinit.lua (пример).
Затем надо как-то завершить стандартный загрузчик, чтобы он не пытался грузить ничего кроме _macroinit.lua.
Для этого удобнее всего будет использовать возвращаемое значение скрипта.