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

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

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

Post by John Doe »

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

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

Update: 0002590: mf.AddMacro/Event: програмное добавление макросов
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

Один товарищ (не помню сейчас его ник) усердно ратовал за это в форуме примерно год назад. Если этого ещё нет на мантисе - поместите туда.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Собирался с этого начать, но в процессе составления описания осознал что большое количество нерешённых сопутствующих вопросов не дают чётко сформулировать тикет.
Например
- Как быть с FileName В актуальных версиях FullPath является вторым параметром функции AddRegularMacro (utils.lua)
- Стоит ли разрешить сохранять в таблице макроса другие поля, кроме жёстко определённых в utils.lua
- Для "временных" макросов актуален вопрос их удаления
- Стоит ли легализовать и переопределение стандартного загрузчика, чтобы убрать шаманство с upvalues Не стоит, см ниже http://forum.farmanager.com/viewtopic.p ... 47#p116247
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

Да, здесь есть много вопросов: как взаимосвязанных, так и независимых друг от друга. Но это не значит, что нельзя открыть тикет на мантисе, обозначив в нём основную желаемую добавку функциональности. Вы не обязаны при этом заранее обозначать все детали.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

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

Тикет разумеется открою, вначале только ещё раз всё обдумаю.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post 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 в таблице макроса)
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post 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 (или передавать третьим аргументом)
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Вызов Macro{} теперь возвращает внутреннюю таблицу макроса.
Можно уже на это полагаться, или всё ещё может поменяться?
С Event{} будет аналогично?
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

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

Post by Skirda »

Потом надо Far Manager переименовать в Far Artificial Life (судя по хотелке). Не? :popcorn:
We are the Borg. You will be assimilated.
So Say We All!
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

John Doe wrote:Вызов Macro{} теперь возвращает внутреннюю таблицу макроса.
Можно уже на это полагаться, или всё ещё может поменяться?
Это по недосмотру. Спасибо за репорт.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Эх, а я уже начал пользоваться )
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

John Doe wrote: Подумалось, что можно полностью переопределить стандартный загрузчик и без использования функций debug.
За поиск и загрузку макрофайлов отвечает рекурсивно вызываемая функция LoadRegularFile (utils.lua).
Она достаточно проста, а значит чтобы реализовать собственную загрузку макросов достаточно поместить подобную функцию в _macroinit.lua (пример).
Затем надо как-то завершить стандартный загрузчик, чтобы он не пытался грузить ничего кроме _macroinit.lua.
Для этого удобнее всего будет использовать возвращаемое значение скрипта.
Как-то так:
  1. --- utils.lua.bak
  2.  
  3. +++ utils.lua
  4.  
  5. @@ -694,6 +694,7 @@
  6.  
  7.        if ok then
  8.  
  9.          env.Macro, env.Event, env.MenuItem, env.CommandLine,
  10.  
  11.          env.NoMacro, env.NoEvent, env.NoMenuItem, env.NoCommandLine = nil
  12.  
  13. +        if msg=="stop" then return msg end
  14.  
  15.        else
  16.  
  17.          numerrors=numerrors+1
  18.  
  19.          ErrMsgLoad(msg,FullPath,isMoonScript,"run")
  20.  
  21. @@ -753,12 +754,15 @@
  22.  
  23.        p = far.ConvertPath(p, F.CPM_FULL) -- needed for relative paths
  24.  
  25.        local macroinit = p:gsub("[\\/]*$", "\\_macroinit.lua")
  26.  
  27.        local info = win.GetFileInfo(macroinit)
  28.  
  29. +      local stop
  30.  
  31.        if info and not info.FileAttributes:find("d") then
  32.  
  33. -        LoadRegularFile(info, macroinit, nil)
  34.  
  35. +        stop = "stop"==LoadRegularFile(info, macroinit, nil)
  36.  
  37.        else
  38.  
  39.          macroinit = nil
  40.  
  41.        end
  42.  
  43. -      far.RecursiveSearch (p, "*.lua,*.moon", LoadRegularFile, bor(F.FRS_RECUR,F.FRS_SCANSYMLINK), macroinit)
  44.  
  45. +      if not stop then
  46.  
  47. +        far.RecursiveSearch (p, "*.lua,*.moon", LoadRegularFile, bor(F.FRS_RECUR,F.FRS_SCANSYMLINK), macroinit)
  48.  
  49. +      end
  50.  
  51.      end
  52.  
  53.  
  54.  
  55.      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 “Обсуждение макросов”