LuaMacro — Lua как язык макросов

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

LuaMacro — Lua как язык макросов

Post by John Doe »

Проект Spring (обсуждение) влился в стабильную версию Far Manager 3.0.

Таким образом, в макросах сейчас доступны:
  • Стандартные функции и библиотеки Lua.
  • В фаре используется LuaJIT (обсуждение), что (в частности) даёт доступ к библиотеке FFI (обсуждение).
  • "Надстройка" над Lua: MoonScript (Подробности и обсуждение)
  • Функции API плагинов, посредством библиотеки LuaFAR (см. luafar_manual.chm)
  • Функции старого макроязыка (API макросов) (Обновление)
    Актуальный мануал, отражающий после перехода на Lua: macroapi_manual.ru.chm.
    (Мануал весьма лаконичен, вместо описания функции старого макроязыка приведены ссылки на устаревший раздел )
См. также:

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

LuaMacro — Lua как язык макросов

Post by John Doe »

Latest post of the previous page:

Я взял себе за правило в макросах всегда использовать mf.print, на всякий случай.

И есть связанный вопрос, по следующему фрагменту из api.lua:

Code: Select all

_G.eval, _G.msgbox, _G.prompt = mf.eval, mf.msgbox, mf.prompt

mf.Keys, mf.exit, mf.print, mf.printf = _G.Keys, _G.exit, _G.print, _G.printf
Все 7 функций дублируются в mf и в _G.
Однако любопытно почему для eval,msgbox,prompt "первична" таблица _G, а для прочих — mf?

P.S.
Вопрос конечно отвлечённый, но не совсем, например функция printf использует _G.print, что будет иметь значение, пожелай я для каких-то целей переопределить _G.print

Shmuel
Posts: 6139
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 317 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

John Doe wrote: Однако любопытно почему для eval,msgbox,prompt "первична" таблица _G, а для прочих — mf?
Просто сделано неединообразно, никакой причины другой не существует.
John Doe wrote: функция printf использует _G.print, что будет иметь значение, пожелай я для каких-то целей переопределить _G.print
Я бы printf выбросил, практика показывает, что ею никто не пользуется (и я тоже). Но кто знает, сейчас выбросишь, а завтра шум поднимется.

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

LuaMacro — Lua как язык макросов

Post by John Doe »

Shmuel wrote: Но кто знает, сейчас выбросишь, а завтра шум поднимется.
Чем раньше выбросишь, тем меньше вероятность что кто-то успеет использовать.

User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 107 times
Been thanked: 12 times

LuaMacro — Lua как язык макросов

Post by sToLp »

John Doe wrote:я лишь предположил причину странного сообщения у sToLp
Это подтверждаю.

Однако и после деинсталляции StackTracePlus запуск macrotest.lua приводит к сообщению об

Shmuel
Posts: 6139
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 317 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

John Doe wrote: Чем раньше выбросишь, тем меньше вероятность что кто-то успеет использовать.
Да скорее всего уже успели.
Но можно поставить её "на счётчик" на полгода, а в мануале пометить как deprecated.

Shmuel
Posts: 6139
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 317 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

sToLp wrote: Однако и после деинсталляции StackTracePlus запуск macrotest.lua приводит к сообщению об ошибке
Поскольку у вас это воспроизводится (а у меня нет), то вам и карты в руки для дальнейшего исследования.

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

LuaMacro — Lua как язык макросов

Post by John Doe »

sToLp wrote: Однако и после деинсталляции StackTracePlus
StackTracePlus влиял только на то, что вместо вывода сообщения о реальной ошибке сам падал (пытаясь использовать функцию print).
Как починить StackTracePlus указано в его теме.
Shmuel wrote: Но можно поставить её "на счётчик" на полгода
Поддерживаю.

User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 107 times
Been thanked: 12 times

LuaMacro — Lua как язык макросов

Post by sToLp »

Восстановил StackTracePlus по инструкции в его теме.
После этого сообщение от macrotest.lua .

Shmuel
Posts: 6139
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 317 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

sToLp wrote:Восстановил StackTracePlus по инструкции в его теме.
После этого сообщение от macrotest.lua .
А, это уже ценная информация. Вероятно вы запускаете макротест, имея открытый редактор или вьювер.

User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 107 times
Been thanked: 12 times

LuaMacro — Lua как язык макросов

Post by sToLp »

Shmuel wrote:Вероятно вы запускаете макротест, имея открытый редактор или вьювер.
Да. Редактор.
А вот чисто .

Shmuel
Posts: 6139
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 317 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

Ага, это уже macrotest надо править. Не учтено, что TypeName (имя типа окна) зависит от текущего языка, о чём упомянуто в Энциклопедии.

User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 107 times
Been thanked: 12 times

LuaMacro — Lua как язык макросов

Post by sToLp »

Обновлённый macrotest выдаёт:

Code: Select all

╔══ LuaMacro ══╗
║ All tests OK ║
╟──────────────╢
║    { OK }    ║
╚══════════════╝
Спасибо!

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

LuaMacro — Lua как язык макросов

Post by John Doe »

Если ошибка возникает при загрузке макросов, то в сообщении не хватает traceback.

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

Shmuel
Posts: 6139
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 317 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

На мантис.

Redisko
Posts: 12
Joined: Tue 06 Jul, 2010 13:15
Has thanked: 1 time
Been thanked: 1 time

LuaMacro — Lua как язык макросов

Post by Redisko »

В файле utils.lua в функции AddRegularMacro я добавил следующее:

Code: Select all

-- добавлена обработка свойств out и keys 
local function _bindKey (keys)
  return function ()
    Keys(keys);
  end
end

local function _bindPrint (keys)
  return function ()
    print(keys);
  end
end
-- конец

local function AddRegularMacro (srctable)
  ...
  if type(srctable.action) == "function" then
    macro.action = srctable.action
  -- добавлена обработка свойств out и keys 
  elseif type(srctable.out) == "string" then
    macro.action = _bindPrint(srctable.out)
  elseif type(srctable.keys) == "string" then
    macro.action = _bindKey(srctable.keys)
  -- конец
  elseif type(srctable.code) == "string" then
    local isMoonScript = srctable.language == "moonscript"
    if srctable.code:sub(1, 1) == "@" then
      macro.code = srctable.code
      macro.language = isMoonScript and "moonscript" or "lua"
    else
    ...
Сделано это для того чтобы упростить написание макро:

Code: Select all

-- Закрытие фара, меню, удаление файла
Macro { area = 'Shell'; key = 'AltF4'; keys = 'F10' }
Macro { area = 'Shell'; key = 'F10';   keys = 'F9' }
Macro { area = 'Shell'; key = 'Del';   keys = 'F8' }

-- Ввод utf-8 символов
Macro { area = 'Editor'; key = 'CtrlShiftR'; out = '®' }
Macro { area = 'Editor'; key = 'CtrlShiftC'; out = '©' }
Macro { area = 'Editor'; key = 'CtrlShift9'; out = '«' }
Macro { area = 'Editor'; key = 'CtrlShift0'; out = '»' }
Macro { area = 'Editor'; key = 'CtrlShiftSpace'; out = ' ' }
Есть ли какой-либо api, для того чтобы не вносить изменения в utils.lua, и не иметь проблем при обновлении пакета LuaMacro?

Shmuel
Posts: 6139
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 317 times

LuaMacro — Lua как язык макросов

Post by Shmuel »

Redisko wrote: Есть ли какой-либо api, для того чтобы не вносить изменения в utils.lua, и не иметь проблем при обновлении пакета LuaMacro?
Такого API нет.
Можно определить свою функцию и поместить её в _macroinit.lua, например:

Code: Select all

local Macro = Macro
function _G.MyMacro(t)
  if t.keys then t.action=function() Keys(t.keys) end; end
  if t.out then t.action=function() print(t.out) end; end
  return Macro(t)
end

Post Reply

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