Page 27 of 39

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

Posted: Mon 16 Jul, 2012 13:44
by John Doe
Проект Spring (обсуждение) влился в стабильную версию Far Manager 3.0.

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

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

Posted: Thu 24 Jul, 2014 19:25
by zg

Latest post of the previous page:

John Doe wrote:Задача: по хоткею позиционировать редактор к месту последней правки.
место последней правки не всегда совпадает с позицией курсора. в EE_CHANGE приходит номер строки, им и пользуйтесь. всё остальное — бессмысленно.

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

Posted: Thu 24 Jul, 2014 19:40
by John Doe
В 99% случаев меня интересует именно то место, где курсор.
Но неважно, это всего лишь пример.

Вопрос как вообще правильнее обрабатывать подобные случаи.
Что лучше использовать: mf.postmacro или far.Timer.

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

Posted: Thu 24 Jul, 2014 19:52
by zg
John Doe wrote:В 99% случаев меня интересует именно то место, где курсор.
тогда можно ловить следующий ee_redraw — получать позицию там.

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

Posted: Thu 24 Jul, 2014 20:04
by John Doe
Действительно. Спасибо.

Вообще если бы не интересовало место курсора и позиция всего окна, то и не затевал бы ничего: работает и CtrlZ CtrlShiftZ.

Ещё рассматривал вариант устанавливать в EE_CHANGE сессионные закладки (это было бы проще всего, но нет для них нормального АПИ).

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

Posted: Thu 31 Jul, 2014 01:15
by John Doe

Если использовать плагиновое апи (ShiftF1), то выделение появляется не сразу после ECTL_SELECT, а только после окончания макроса.
Если использовать макро апи (ShiftF2), то выделение появляется сразу.

Вопрос: почему так и можно ли исправить?
Update:
Надо было добавить editor.Redraw()

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

Posted: Wed 06 Aug, 2014 10:36
by John Doe
Этот код вешает фар:

Code: Select all

lua:Keys"AltF7 * Enter" far.Show()
Похожая проблема: http://forum.farmanager.com/viewtopic.p ... 48#p115948

Update
Вместо far.Show можно подставить и другие функции. Например Dlg.GetValue

Если обернуть в far.Timer, то не виснет.

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

Posted: Thu 14 Aug, 2014 20:03
by John Doe
Нужен надёжный способ выполнить определённый код после загрузки всех макросов.
flags="RunAfterFARStart"; подошёл бы, но он выполняется лишь после первой загрузки, тогда как требуется после каждой.
Варианты:
- определённый макрофайл загружать последним (как _macroinit.lua только наоборот).
- добавить специальное событие (LoadMacrosDone)

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

Posted: Thu 14 Aug, 2014 20:12
by Shmuel
А просто mf.postmacro в произвольном макрофайле не годится?

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

Posted: Thu 14 Aug, 2014 20:14
by John Doe
Если после этого в другом произвольном макрофайле в просессе загрузки будет ошибка (или например сработает какая-либо диалоговая функция), то наш код выполнится раньше окончания загрузки.

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

Posted: Thu 14 Aug, 2014 20:51
by Shmuel
John Doe wrote:Если после этого в другом произвольном макрофайле в просессе загрузки будет ошибка (или например сработает какая-либо диалоговая функция), то наш код выполнится раньше окончания загрузки.
На чём основывается данное утверждение?

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

Posted: Thu 14 Aug, 2014 20:59
by John Doe
_macroinit.lua wrote:
  1. mf.postmacro(far.Message,"posted")
  2. far.Message"1"
  3. far.Message"2"
P.S.
Вместо mf.postmacro пробовал и far.Timer, с тем же успехом (есть и на мантисе).

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

Posted: Thu 14 Aug, 2014 22:04
by Shmuel
_macroinit.lua wrote:
  1. mf.postmacro(far.Message,"posted")
  2. far.Message"1"
  3. far.Message"2"
Исправлено.

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

Posted: Fri 22 Aug, 2014 21:16
by John Doe

Code: Select all

mf.usermenu (mode, filename)
...
- mode может содержать бит 0x100, в этом случае функция возвращается
    только по закрытии пользовательского меню (синхронный вызов). 
lua:mf.usermenu(0x100)— и ничего не происходит

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

Posted: Sat 23 Aug, 2014 07:57
by Shmuel
John Doe wrote:lua:mf.usermenu(0x100)— и ничего не происходит
Исправлено.

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

Posted: Tue 28 Oct, 2014 13:09
by John Doe
Сложно ли функциям akey и waitkey добавить возможность возвращать INPUT_RECORD?

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

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

Posted: Tue 28 Oct, 2014 14:23
by John Doe
Не скажу точно когда началось, но уже некоторое время наблюдаю неприятный эффект: каждое последующее выполнение far.MacroLoadAll() занимает всё больше времени.
Можно проверить таким скриптом:

Code: Select all

local max = 50
far.Message("  ...  ","","","")
for i=1,max do
  local start = Far.UpTime
  far.MacroLoadAll()
  local delay = Far.UpTime-start
  far.Message(i..":"..delay,"","","k")
  --if delay<500 then win.Sleep(500 - delay) end
end
far.AdvControl"ACTL_REDRAWALL"
В результате время перезагрузки макросов может достигать абсолютно неприемлемых значений (даже не секунды, а десятки секунд)

Перезагрузка плагина (временно) спасает: lua:_G.RecreateLuaState = true;