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

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

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

Post by John Doe » Mon 16 Jul, 2012 13:44

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

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

Shmuel
Posts: 5899
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 220 times

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

Post by Shmuel » Fri 04 Jul, 2014 22:14

Latest post of the previous page:

John Doe wrote:Фар падает.
Воспроизводится и на довольно старых билдах.

LuaMacro непричём? На мантис?
Думаю, что ни при чём. На мантис.
Кстати, для воспроизведения достаточно только этого:
  1. local F = far.Flags
  2. Event{ description="VE_CLOSE";
  3.   group="ViewerEvent";
  4.   condition=function(id,Event) return Event==F.VE_CLOSE end;
  5.   action=function() far.Show() end
  6. }

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

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

Post by John Doe » Fri 04 Jul, 2014 23:01

Оказывается на мантисе уже есть.

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

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

Post by John Doe » Wed 23 Jul, 2014 15:24

  1. Macro {
  2.   area="ShellAutoCompletion DialogAutoCompletion"; key="F2";
  3.   condition=function() far.Show(Object.Bof,Area.Current) return false end;
  4.   action=function() end;
  5. }
Почему при нажатии F2 функция condition вызывается дважды?

А проблема собственно в том, что не получается составить макрос, работающий с непервым элементом автодополнения:

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

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

Post by John Doe » Thu 24 Jul, 2014 18:28

Из обработчика EE_CHANGE невозможно вызвать editor.GetInfo.
Чтобы это обойти, можно было бы использовать ACTL_SYNCHRO, но LuaMacro не предоставляет такой возможности.

В качестве альтернативы, вместо ACTL_SYNCHRO можно использовать far.Timer, или mf.postmacro.
Оба способа работают (хотя непонятно какой интервал выбрать для far.Timer).

Хотелось бы всё-таки выяснить, какой из двух вариантов предпочтительнее использовать для задач, подобных моей.

User avatar
zg
zero-gravity
Posts: 5623
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 104 times
Contact:

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

Post by zg » Thu 24 Jul, 2014 18:57

John Doe wrote:Из обработчика EE_CHANGE невозможно вызвать editor.GetInfo.
EditorID приходит. что ещё нужно?
Хотелось бы всё-таки выяснить, какой из двух вариантов предпочтительнее использовать для задач, подобных моей.
задачу опишите поподробнее.

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

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

Post by John Doe » Thu 24 Jul, 2014 19:11

Задача: по хоткею позиционировать редактор к месту последней правки.
Решение:

User avatar
zg
zero-gravity
Posts: 5623
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 104 times
Contact:

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

Post by zg » Thu 24 Jul, 2014 19:25

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

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

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

Post by John Doe » Thu 24 Jul, 2014 19:40

В 99% случаев меня интересует именно то место, где курсор.
Но неважно, это всего лишь пример.

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

User avatar
zg
zero-gravity
Posts: 5623
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 104 times
Contact:

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

Post by zg » Thu 24 Jul, 2014 19:52

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

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

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

Post by John Doe » Thu 24 Jul, 2014 20:04

Действительно. Спасибо.

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

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

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

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

Post by John Doe » Thu 31 Jul, 2014 01:15


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

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

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

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

Post by John Doe » Wed 06 Aug, 2014 10:36

Этот код вешает фар:

Code: Select all

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

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

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

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

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

Post by John Doe » Thu 14 Aug, 2014 20:03

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

Shmuel
Posts: 5899
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 220 times

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

Post by Shmuel » Thu 14 Aug, 2014 20:12

А просто mf.postmacro в произвольном макрофайле не годится?

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

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

Post by John Doe » Thu 14 Aug, 2014 20:14

Если после этого в другом произвольном макрофайле в просессе загрузки будет ошибка (или например сработает какая-либо диалоговая функция), то наш код выполнится раньше окончания загрузки.

Shmuel
Posts: 5899
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 220 times

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

Post by Shmuel » Thu 14 Aug, 2014 20:51

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

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

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

Post by John Doe » Thu 14 Aug, 2014 20:59

_macroinit.lua wrote:
  1. mf.postmacro(far.Message,"posted")
  2. far.Message"1"
  3. far.Message"2"
P.S.
Вместо mf.postmacro пробовал и far.Timer, с тем же успехом (есть и на мантисе).

Post Reply

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