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

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

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: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Latest post of the previous page:

При наличии такого обработчика первый за сессию вызов RESearch с помощью Plugin.Call приводит к падению LuaMacro.

Code: Select all

lua:Plugin.Call("F250C12A-78E2-4ABC-A784-3FDD3156E415","Search")
Возможно связано с тем, что первый вызов RESearch долгий (может занимать почти секунду).
Attachments
CrashLogs.7z
(8.34 KiB) Downloaded 80 times
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

John Doe wrote:При наличии такого обработчика первый за сессию вызов RESearch с помощью Plugin.Call приводит к падению LuaMacro.

Code: Select all

lua:Plugin.Call("F250C12A-78E2-4ABC-A784-3FDD3156E415","Search")
То, что Фар говорит, что исключение в LuaMacro.dll, ещё не означает, что источник проблемы в ней. Попробуйте воспроизвести данную проблему, заменив RESearch на какой-либо другой плагин (желательно с открытыми исходниками).
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Удалось ли вам воспроизвести с RESearch?

С другими плагинами не получается повторить.

Выяснил, что Plugin.Call непричём, то же самое происходит и c Keys: lua:Keys"F11 s Enter".
Но при ручном вызове из меню проблем нет.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

John Doe wrote:Удалось ли вам воспроизвести с RESearch?
[......]
Но при ручном вызове из меню проблем нет.
Удалось. И при ручном вызове тоже.
User avatar
Wave
Posts: 1885
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

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

Post by Wave »

Как вызвать макрос из макроса? Известны: filename, area\key\description\etc. В файле может быть несколько макросов и может не быть ничего кроме Macro {}
В энциклопедии есть варианты типа lua: @<filename> [<args>]
Но это немножечко не то. У меня есть куча макросов, частично написанных самим, больше скачанных с форума. Некоторые я так редко использую, что напрочь забываю хоткеи. Гораздо удобней забить их вызов в FarMenu.ini и Editor.Menu.lua. Но как?

P.s. собственное меню в этом случае гораздо удобней всех MacroBrowser’ов в разы.
Пользуюсь ФАРом больше 20 лет © собирательный.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Wave wrote:Как вызвать макрос из макроса?
Если файл с макросами лежит в scripts, то можно использовать eval(key,2)
Если нет, то вместо макросов можно оформить таблицу функций, поместить файл в modules, и вызывать с помощью require
собственное меню в этом случае гораздо удобней всех MacroBrowser’ов в разы.
MacroBrowser alt. тоже способен решить вашу задачу, с его помощью легко получить список макросов по имени файла
User avatar
Wave
Posts: 1885
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

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

Post by Wave »

Спасибо, eval(key,2) — то, что надо. Я за него забыл, потому что думал, что он может только eval([some code]).

Список макросов по имени файла — это, конечно, хорошо, но сильно не то. Имя файла, как и key, я знаю на момент установки макроса и внесения его себе в меню. Когда такой макрос мне нужен, а я уже забыл его хоткей, имя файла при этом я тоже помню очень приблизительно. И через MacroBrowser alt. мне его придётся искать, а потом уже вызывать. Тогда как своё меню — это, например, в редакторе: «Apps → Настройки редактора → Включить автосвёртку» или «Apps → Сервис → Spellcheck» или «Apps → Строки → Дублировать строку».
Такое вот. Функции сгруппированы по подменю удобным мне способом. Всё на виду, на всё про всё три нажатия хоткеев, при этом в каждый момент на экране небольшой список, в котором нужный пункт находится взглядом моментально.
Пользуюсь ФАРом больше 20 лет © собирательный.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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

P.S.
Идея вообще интересная, подумаю, может быть есть смысл дать возможность назначать макросам таги, и таким образом дополнительно их группировать.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Дано:
Запускаем фар, открываем любой файл на просмотр (здесь и далее отменяя все всплывающие сообщения).
С помощью F6 переключаемся в редактор.
Закрываем редактор по Esc.

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

LuaMacro непричём? На мантис?
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

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

LuaMacro непричём? На мантис?
Думаю, что ни при чём. На мантис.
Кстати, для воспроизведения достаточно только этого:
  1. local F = far.Flags
  2.  
  3. Event{ description="VE_CLOSE";
  4.  
  5.   group="ViewerEvent";
  6.  
  7.   condition=function(id,Event) return Event==F.VE_CLOSE end;
  8.  
  9.   action=function() far.Show() end
  10.  
  11. }
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Оказывается на мантисе уже есть.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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

А проблема собственно в том, что не получается составить макрос, работающий с непервым элементом автодополнения:
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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

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

Хотелось бы всё-таки выяснить, какой из двух вариантов предпочтительнее использовать для задач, подобных моей.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

John Doe wrote:Из обработчика EE_CHANGE невозможно вызвать editor.GetInfo.
EditorID приходит. что ещё нужно?
Хотелось бы всё-таки выяснить, какой из двух вариантов предпочтительнее использовать для задач, подобных моей.
задачу опишите поподробнее.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Задача: по хоткею позиционировать редактор к месту последней правки.
Решение:
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

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

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