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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 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
HaRT
Moderator
Posts: 11458
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 270 times
Been thanked: 417 times

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

Post by HaRT »

Latest post of the previous page:

John Doe wrote: Tue 23 Jan, 2024 18:55 Regular macros: make the field 'action' optional.
Хотелось бы понять, в каких сценариях это может быть полезно. Просто чтобы проглотить какое-то клавиатурное нажатие?
Про condition знаю, но не понимаю, как он может пригодиться в отсутствие action'а.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Shmuel
Posts: 7244
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 636 times

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

Post by Shmuel »

HaRT wrote: Tue 23 Jan, 2024 19:13 Хотелось бы понять, в каких сценариях это может быть полезно.
Есть сценарии, где ф-ция action заведомо никогда не будет выполняться, но должна была присутствовать, т.к. без неё макрос бы не загрузился. Один из таких сценариев - keylogger, где condition просто регистрирует поступающие нажатия. Возможны и другие примеры.
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

Насчитал у себя 3 случая, где action задан холостой функцией.
В основном это какое-то дополнительное действие, которое не должно мешать основному.

Но замечу, что если (при отсутствующем action) condition вернёт положительное значение, то макрос "сработает".
И при наличии конфликтующих макросов меньшего приоритета "съест" нажатие, что тоже можно использовать (мне кажется что-то такое у меня было).

Если же несколько макросов одного приоритета, то будет меню конфликта. И даже такому использованию можно найти смысл, например "холостой" пункт может служить заголовком в меню конфликта.

P.S.
К нововведению я отношусь амбивалентно. С одной стороны применение конечно есть. С другой - раньше всё это тоже работало.
Возможность неявного назначения холостой функции может затруднить понимание нюансов функционирования для новичков.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4565
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

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

Post by buniak_a_h »

HaRT wrote: Tue 23 Jan, 2024 19:13 <…>
Про condition знаю, но не понимаю, как он может пригодиться в отсутствие action'а.
У меня есть макросы, в которых всё, что надо, делается именно в condition :smile:
Shmuel, уточняющие вопросы:
  1. Макрос без action попадёт в МЕНЮ выбора, или он будет вести себя так, как если бы condition вернул false?
  2. EnumMacros, насколько я понимаю, вернёт таблицу без action? Или с пустым (как с полем key)?
  3. Будет ли нормально работать eval(key,2) ?
────────
Кстати! Придётся перепроверить свои скрипты, т.к. есть ситуации, когда я перебираю макросы (ищу по ГУИДу или по хоткею), и если нахожу - тупо выполняю action, которого, получается, теперь может и не быть. Считайте это замечание "критикой" лишних телодвижений…
Shmuel
Posts: 7244
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 636 times

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

Post by Shmuel »

buniak_a_h,
Это нововведение ничего не меняет, на существующих макросах, в которых есть action, никак не скажется.
Насчёт поведения новых макросов без action - всё очень просто - плагин LuaMacro в этом случае сам назначает пустую функцию, т.е. function() end в качестве action.
Таким образом, это нововведение - не более, чем синтактический сахар, позволяющий опускать 'action' в тех случаях, когда она либо никогда не будет вызвана, либо ничего не должна делать.
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

Shmuel wrote: Wed 24 Jan, 2024 09:52 плагин LuaMacro в этом случае сам назначает пустую функцию, т.е. function() end в качестве action.
Мне кажется это уточнение было бы не лишним в мануале.
https://t.me/FarManager — Telegram чат
Yegor
Posts: 1506
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 52 times
Been thanked: 94 times

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

Post by Yegor »

Не знаю, правильная ли тема, при попытки открытия Macro Browser получаю:

Code: Select all

╔═══════════════════════════════════════════════ Error ═══════════════════════════════════════════════╗
║ C:\Far\Plugins\LuaMacro\LuaMacro.dll:                                                               ║
║ C:\Far\Plugins\LuaMacro\mbrowser.lua:445: attempt to index a nil value                              ║
║ stack traceback:                                                                                    ║
║    C:\Far\Plugins\LuaMacro\mbrowser.lua:445: in function 'macrobrowser'                             ║
║    C:\Far\Plugins\LuaMacro\LuaMacro.lua:508: in function <C:\Far\Plugins\LuaMacro\LuaMacro.lua:448> ║
╟─────────────────────────────────────────────────────────────────────────────────────────────────────╢
Far Manager 3.0.6366.0 x64 / Windows 11
Last edited by Yegor on Sun 01 Sep, 2024 01:30, edited 1 time in total.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
Shmuel
Posts: 7244
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 636 times

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

Post by Shmuel »

Yegor wrote: Sun 01 Sep, 2024 01:30 при попытки открытия Macro Browser получаю:
Это, судя по коду, повреждение в базе данных плагина (таблица table_values, key_id=2, name="MacroBrowser").
Удаление данной записи должно помочь.

Если у вас установлен плагин Polygon, то было бы любопытно посмотреть на следующее:
  1. Зайти в файл 4EBBEFC8-2084-4B7F-94C0-692CE136894D.db
  2. Зайти в таблицу table_values
  3. Нажать CtrlF4 (сортировка по колонке name)
  4. Стать курсором на строку MacroBrowser в колонке name и нажать Enter
  5. В появившемся диалоге стать на поле, показывающее value, и нажать AltF3
  6. В новом появившемся диалоге нажать Copy и прислать сюда содержимое буфера обмена
Yegor
Posts: 1506
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 52 times
Been thanked: 94 times

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

Post by Yegor »

Shmuel wrote: Sun 01 Sep, 2024 07:22 В новом появившемся диалоге нажать Copy и прислать сюда содержимое буфера обмена
Надеюсь скопировал то, что надо:

Code: Select all

local idx={}; for i=1,1 do idx[i]={} end
do local t=idx[1]
  t["SortKey"] = "C+F4"
  t["InvSort"] = 1
end
return idx[1]
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
Yegor
Posts: 1506
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 52 times
Been thanked: 94 times

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

Post by Yegor »

Думаю, не я ли это сломал: когда-то давно, кто-то что-то спрашивал на форуме и я добавлял колонку в диалог Macro Browser, но потом вернул все назад, т.к. мне это было не нужно.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
Shmuel
Posts: 7244
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 636 times

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

Post by Shmuel »

Yegor wrote: Sun 01 Sep, 2024 17:52 добавлял колонку в диалог Macro Browser
Да, плагин ожидает здесь либо одно из 3-х заданных сочетаний клавиш, либо отсутствие данных, и спотыкается на неизвестном сочетании. Возможно сделаю защиту от этого.
gotar
Posts: 519
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 31 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

я вызываю скрипт таким образомlua:@script arg1 arg2 arg3. Как внутри скрипта получить строку с его аргументами? или аргументы в массиве? или еще как нибудь. В справке написано

Code: Select all

If a macrosequence begins with the @ character, then the rest of the sequence is treated as name of the file containing Lua script.

Environment variables in the file name are automatically expanded. 
The global (within the environment of the script) variable _filename contains the file name. 
Such scripts are easier for debugging and modifications, as they are automatically reloaded at each macro invocation. 
Example 1:

lua: @%FARHOME%\test\test.lua 123, "hello"

и ни слова о том как из ... получить аргументы.
Last edited by gotar on Mon 06 Jan, 2025 12:06, edited 4 times in total.
Shmuel
Posts: 7244
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 636 times

Ликбез по Lua

Post by Shmuel »

gotar wrote: Mon 06 Jan, 2025 11:43 Как внутри скрипта получить строку с его аргументами? или аргументы в массиве?
Согласно документации Lua 5.1, аргументы скрипта можно получить через ...
Например: far.Show(...)
Если хотите массив, то можно например local args = {...}
gotar
Posts: 519
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 31 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

far.Show(...) показывает nil
Last edited by gotar on Mon 06 Jan, 2025 12:10, edited 2 times in total.
gotar
Posts: 519
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 31 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

Shmuel wrote: Mon 06 Jan, 2025 12:06 Если хотите массив, то можно например local args = {...}
Far.Show(args[0]) показывает nil
Last edited by gotar on Mon 06 Jan, 2025 12:13, edited 1 time in total.
Shmuel
Posts: 7244
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 636 times

Ликбез по Lua

Post by Shmuel »

lua:@1.lua 6,7,8
╔════════════════╗ ║ 1│ 6 ║ ║ 2│ 7 ║ ║ 3│ 8 ║ ╚═ 3 arguments ══╝
Post Reply

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