[wish] Програмное добавление макросов (mf.AddMacro и др.)

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 11429
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

[wish] Програмное добавление макросов (mf.AddMacro и др.)

Post by John Doe » Mon 27 Jan, 2014 14:17

Предполагается такое использование:
  1. Динамическое добавление временных макросов
    Нужен аналог far.MacroAdd, но поддерживающий возможности LuaMacro.
    Т.е. допускающий использование upvalues, обрабатывающий клавиши заданные регекспами, и пр.
  2. Расширение стандартного загрузчика макросов собственными функциями.
    На форуме сейчас уже есть 3 скрипта, пытающихся расширять Macro (например rebind) , и будут ещё.
Приватная функция AddMacro из utils.lua почти полностью подходит под требования, но сейчас она в явном виде недоступна скриптам.
Известны такие способы получения доступа к этой функции:
  • получение функции из окружения скрипта
  • доступ с использованием отладочных функций debug
При этом возникают такие вопросы:
- функцию всё равно требуется где-то сохранить (в _G или в локальной переменной модуля)
- в сохранённой функции используется upvalue FileName, а значит что в дальнейшем при её использовании будет сохраняться неактуальное имя файла.

Предлагаю обсудить "легализацию" функции, ведь это позволит избавиться от вынужденно используемых хаков, а значит сделает мир чище.
Подобное обсуждалось в старых темах:

Update: 0002590: mf.AddMacro/Event: програмное добавление макросов

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

Re: [wish] Програмное добавление макросов (mf.AddMacro и др.

Post by Shmuel » Mon 27 Jan, 2014 15:23

Один товарищ (не помню сейчас его ник) усердно ратовал за это в форуме примерно год назад. Если этого ещё нет на мантисе - поместите туда.

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

[wish] Програмное добавление макросов (mf.AddMacro и др.

Post by John Doe » Mon 27 Jan, 2014 15:38

Собирался с этого начать, но в процессе составления описания осознал что большое количество нерешённых сопутствующих вопросов не дают чётко сформулировать тикет.
Например
- Как быть с FileName В актуальных версиях FullPath является вторым параметром функции AddRegularMacro (utils.lua)
- Стоит ли разрешить сохранять в таблице макроса другие поля, кроме жёстко определённых в utils.lua
- Для "временных" макросов актуален вопрос их удаления
- Стоит ли легализовать и переопределение стандартного загрузчика, чтобы убрать шаманство с upvalues Не стоит, см ниже viewtopic.php?p=116247#p116247

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

Re: [wish] Програмное добавление макросов (mf.AddMacro и др.

Post by Shmuel » Mon 27 Jan, 2014 15:47

Да, здесь есть много вопросов: как взаимосвязанных, так и независимых друг от друга. Но это не значит, что нельзя открыть тикет на мантисе, обозначив в нём основную желаемую добавку функциональности. Вы не обязаны при этом заранее обозначать все детали.

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

Re: [wish] Програмное добавление макросов (mf.AddMacro и др.

Post by John Doe » Mon 27 Jan, 2014 16:09

Не хотелось бы формулировать тикет в совсем уж общем виде.
А для обсуждения форум намного удобнее.
Возможно у кого-то есть свежие мысли, или альтернативное видение вопроса.

Тикет разумеется открою, вначале только ещё раз всё обдумаю.

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

[wish] Програмное добавление макросов (mf.AddMacro и др.

Post by John Doe » Tue 28 Jan, 2014 13:12

John Doe wrote:- Стоит ли легализовать и переопределение стандартного загрузчика, чтобы убрать шаманство с upvalues
Подумалось, что можно полностью переопределить стандартный загрузчик и без использования функций debug.
За поиск и загрузку макрофайлов отвечает рекурсивно вызываемая функция LoadOneFile LoadRegularFile (utils.lua).
Она достаточно проста, а значит чтобы реализовать собственную загрузку макросов достаточно поместить подобную функцию в _macroinit.lua (пример).
Затем надо как-то завершить стандартный загрузчик, чтобы он не пытался грузить ничего кроме _macroinit.lua.
Для этого удобнее всего будет использовать возвращаемое значение скрипта.
(альтернативно workaround: грузить скрипты не из Macros\scripts)

И остаются уже упомянутые выше вопросы.
- как сохранить дополнительные значения в таблице макроса, или как получить прямой доступ к ней (GetMacroById)
- как передать имя файла не используя upvalue AddMacro_filename (надо предусмотреть интерфейс в mf.AddMacro)
- как удалять макросы (workaround: поле disable в таблице макроса)

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

Re: [wish] Програмное добавление макросов (mf.AddMacro и др.

Post by John Doe » Wed 29 Jan, 2014 16:17

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 (или передавать третьим аргументом)

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

Re: [wish] Програмное добавление макросов (mf.AddMacro и др.

Post by John Doe » Tue 17 Jun, 2014 14:00

Вызов Macro{} теперь возвращает внутреннюю таблицу макроса.
Можно уже на это полагаться, или всё ещё может поменяться?
С Event{} будет аналогично?

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Re: [wish] Програмное добавление макросов (mf.AddMacro и др.

Post by Skirda » Tue 17 Jun, 2014 14:14

Потом надо Far Manager переименовать в Far Artificial Life (судя по хотелке). Не? :popcorn:
We are the Borg. You will be assimilated.
So Say We All!

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

Re: [wish] Програмное добавление макросов (mf.AddMacro и др.

Post by Shmuel » Tue 17 Jun, 2014 14:44

John Doe wrote:Вызов Macro{} теперь возвращает внутреннюю таблицу макроса.
Можно уже на это полагаться, или всё ещё может поменяться?
Это по недосмотру. Спасибо за репорт.

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

Re: [wish] Програмное добавление макросов (mf.AddMacro и др.

Post by John Doe » Tue 17 Jun, 2014 14:45

Эх, а я уже начал пользоваться )

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

[wish] Програмное добавление макросов (mf.AddMacro и др.)

Post by John Doe » Thu 14 Jul, 2016 22:23

John Doe wrote: Подумалось, что можно полностью переопределить стандартный загрузчик и без использования функций debug.
За поиск и загрузку макрофайлов отвечает рекурсивно вызываемая функция LoadRegularFile (utils.lua).
Она достаточно проста, а значит чтобы реализовать собственную загрузку макросов достаточно поместить подобную функцию в _macroinit.lua (пример).
Затем надо как-то завершить стандартный загрузчик, чтобы он не пытался грузить ничего кроме _macroinit.lua.
Для этого удобнее всего будет использовать возвращаемое значение скрипта.
Как-то так:
  1. --- utils.lua.bak
  2. +++ utils.lua
  3. @@ -694,6 +694,7 @@
  4.        if ok then
  5.          env.Macro, env.Event, env.MenuItem, env.CommandLine,
  6.          env.NoMacro, env.NoEvent, env.NoMenuItem, env.NoCommandLine = nil
  7. +        if msg=="stop" then return msg end
  8.        else
  9.          numerrors=numerrors+1
  10.          ErrMsgLoad(msg,FullPath,isMoonScript,"run")
  11. @@ -753,12 +754,15 @@
  12.        p = far.ConvertPath(p, F.CPM_FULL) -- needed for relative paths
  13.        local macroinit = p:gsub("[\\/]*$", "\\_macroinit.lua")
  14.        local info = win.GetFileInfo(macroinit)
  15. +      local stop
  16.        if info and not info.FileAttributes:find("d") then
  17. -        LoadRegularFile(info, macroinit, nil)
  18. +        stop = "stop"==LoadRegularFile(info, macroinit, nil)
  19.        else
  20.          macroinit = nil
  21.        end
  22. -      far.RecursiveSearch (p, "*.lua,*.moon", LoadRegularFile, bor(F.FRS_RECUR,F.FRS_SCANSYMLINK), macroinit)
  23. +      if not stop then
  24. +        far.RecursiveSearch (p, "*.lua,*.moon", LoadRegularFile, bor(F.FRS_RECUR,F.FRS_SCANSYMLINK), macroinit)
  25. +      end
  26.      end
  27.  
  28.      far.RecursiveSearch (DirMacros.."\\internal", "*.lua", LoadRecordedFile, 0)
Т.е., если вся загрузка уже произведена в _macroinit.lua, то возвращаем "stop", и luamacro пропускает рекурсивное сканирование папки scripts.

Update:
http://bugs.farmanager.com/view.php?id=3267

Post Reply

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