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:

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

Post by John Doe »

Latest post of the previous page:

Shmuel wrote: Mon 21 Oct, 2019 10:17 Невалидный Idx (и другие невалидные ситуации) могут быть для всех значений 3-го параметра. Какой смысл вводить эту фичу только для свойства 8 ?
Необязательно только для 8.
Можно в таких случах возвращать nil для всех.

https://bugs.farmanager.com/view.php?id=3748
Last edited by John Doe on Mon 21 Oct, 2019 10:55, edited 1 time in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

John Doe wrote: Mon 21 Oct, 2019 10:23 Необязательно только для 8.
Можно в таких случах возвращать nil для всех.
Вы правы, для этого есть Мантис.
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 »

Code: Select all

lua:Plugin.Call("42E4AEB1-A230-44F4-B33C-F195BB654931")
Гуид принадлежит NetBox.

Очевидно плагин не рассчитан на такой вызов, но может быть возможно защитить luamacro от падения?

Code: Select all

Exception:    0xC0000005 - EXCEPTION_ACCESS_VIOLATION
Details:      Memory at F05A7F35 could not be read
errno:        0x00000000 - No error
LastError:    0x00000012 - There are no more files.
NTSTATUS:     0x80000006 - {No More Files}  No more files were found which match the file specification.
Address:      0x74F0C0A0 - KERNELBASE.dll!WideCharToMultiByte
Source:       
Function:     OpenW
Module:       C:\APPs\Far3\Plugins\LuaMacro\luamacro.dll
Version:      3.0.0.5546 x86 (acb68af)
OS:           10.0.17763.2.0.0.256.1 (version 1809, OS build 17763.973)

0x74F0C0A0 KERNELBASE.dll!WideCharToMultiByte
0x63E12838 luafar3.dll!luaopen_luafar3
0x63E12908 luafar3.dll!luaopen_luafar3
0x63DFA7F4 luafar3.dll!LF_SetFindList
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

Это падает NetBox (несмотря на то, что в сообщении указано LuaMacro).

Впрочем, будем посмотреть.
Last edited by Shmuel on Tue 21 Jan, 2020 14:59, edited 1 time in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

Судя по стеку, да, падает LuaFAR, но он получает от NetBox'а указатель на строку, который указывает на память, не принадлежащую NetBox'у (то есть "мусорный" указатель). LuaFAR проверяет указатель на NULL, но у него нет средств отличить мусорный указатель от валидного.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

John Doe, вот патч, который предотвращает падение. Там 2 бранча на гитхабе, патч, естественно, для Far3.

Code: Select all

--- Old\FarPlugin.cpp	Sun Jul 21 08:58:38 2019
+++ New\FarPlugin.cpp	Wed Jan 22 20:39:33 2020
@@ -309,6 +309,8 @@
 
   try
   {
+    if (Info->OpenFrom == OPEN_FROMMACRO)
+      return nullptr;
     ResetCachedInfo();
     intptr_t Item = 0;
     if (*Info->Guid == MenuCommandsGuid)
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

сделайте пул-реквест, у Алекса права есть.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

zg wrote: Fri 24 Jan, 2020 00:02сделайте пул-реквест
Сделаю в ближайшие дни.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

@Far group, @John Doe
Просьба применить приложенный патч.
Изменение состоит в снятии ненужных ограничений при создании глобальных таблиц MacroAPI (Area, Editor и т.д.)
Там есть запрет на доступ к метатаблицам этих таблиц, этот запрет был сделан "так, на всякий случай".
Но оказалось, что из-за этого, например, Lunatic Python данные глобальные переменные просто не видит.
patch.diff
(1.19 KiB) Downloaded 193 times
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

Не работает открытие на редактирование ошибочного скрипта модуля из окошка об ошибке при пере-/загрузке макросов:

1. Вношу в какой-нибудь скрипт модуля ошибку, например, end в самое начало LuaExpAdv.lua.
2. (Для наглядности) перехожу в какую-нибудь неслучайную директорию, например, C:\Windows\System32.
3. Запускаю Фар: far /p"%FARHOME%\Plugins\LuaMacro" D:\ C:\.
4. Получаю , нажимаю [ Edit ].

Ожидаю, что файл LuaExpAdv.lua откроется на редактирование, но вместо этого получаю , в которой почему-то фигурирует путь из п.2, а сообщение из первой ошибки, похоже, трактуется как имя файла. (Также там присутствует символ разрыва строки).
Фар есть инструмент, а не нянька. © 2009 DrKnS
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

HaRT wrote: Tue 11 Oct, 2022 21:11 Не работает открытие на редактирование ошибочного скрипта модуля из окошка об ошибке при пере-/загрузке макросов
  1. Есть такое. По идее можно доработать для учёта подобных случаев.
  2. Безотносительно к данному недостатку в LuaMacro, вызов модулей при (пере)загрузке макросов это плохая практика. Модуль должен вызываться при исполнении макроса.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

Shmuel wrote: Tue 11 Oct, 2022 21:32 можно доработать для учёта подобных случаев
Если не слишком сложно, не будете ли так добры? Из любви к прекрасному. :)
Shmuel wrote: Tue 11 Oct, 2022 21:32 вызов модулей при (пере)загрузке макросов это плохая практика
Я, собственно, сам-то модулей не пишу, а натолкнулся на эту ошибку ровно на указанном модуле при слиянии локальных изменений со свежей версией (v2.4). Почему он вызывается при пере-/загрузке макросов, я понятия не имею.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

HaRT wrote: Tue 11 Oct, 2022 21:49 Если не слишком сложно, не будете ли так добры? Из любви к прекрасному.
Постараюсь поиграться с этим, но не уверен насчёт сроков.
HaRT wrote: Tue 11 Oct, 2022 21:49 Я, собственно, сам-то модулей не пишу
Для вызова модуля при перезагрузке макрофайла достаточно указать require <some_module> вне функций макроса, например, в начале макрофайла. А плохая практика это потому, что заранее неизвестно, какие макросы будут вызываться, возможно этот модуль и не потребуется, а мы его уже загрузили "на всякий случай".

Например у меня есть макрос калькулятора, там есть языковая опция Python. Так вот Python это очень тяжёлый модуль (идёт натурально загрузка целого Питона), зачем его грузить заранее, а вдруг я калькулятор в данный день совсем не вызову или вызову, но с языковой опцией Lua.
Last edited by Shmuel on Tue 11 Oct, 2022 22:06, edited 1 time in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

HaRT wrote: Tue 11 Oct, 2022 21:49 Если не слишком сложно
To Far Group: приложен патч для применения из папки plugins\luamacro.
В чейнжлог плагина LuaMacro можно записать что-то вроде "Fix opening a module in the editor from the error message box"
patch.diff
(2.39 KiB) Downloaded 75 times
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

Исправлено в сборке 6040. Спасибо @Shmuel и @DrKnS!
Фар есть инструмент, а не нянька. © 2009 DrKnS
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

DrKnS, исправьте пожалуйста Version в luamacro\_globalinfo.lua, 768 --> 770.
Post Reply

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