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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 11096
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 67 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: 5097
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 140 times

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

Post by Shmuel » Tue 23 Jun, 2015 15:32

Latest post of the previous page:

На мантис.

Redisko
Posts: 12
Joined: Tue 06 Jul, 2010 13:15
Has thanked: 1 time
Been thanked: 1 time

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

Post by Redisko » Tue 14 Jul, 2015 23:59

В файле utils.lua в функции AddRegularMacro я добавил следующее:

Code: Select all

-- добавлена обработка свойств out и keys 
local function _bindKey (keys)
  return function ()
    Keys(keys);
  end
end

local function _bindPrint (keys)
  return function ()
    print(keys);
  end
end
-- конец

local function AddRegularMacro (srctable)
  ...
  if type(srctable.action) == "function" then
    macro.action = srctable.action
  -- добавлена обработка свойств out и keys 
  elseif type(srctable.out) == "string" then
    macro.action = _bindPrint(srctable.out)
  elseif type(srctable.keys) == "string" then
    macro.action = _bindKey(srctable.keys)
  -- конец
  elseif type(srctable.code) == "string" then
    local isMoonScript = srctable.language == "moonscript"
    if srctable.code:sub(1, 1) == "@" then
      macro.code = srctable.code
      macro.language = isMoonScript and "moonscript" or "lua"
    else
    ...
Сделано это для того чтобы упростить написание макро:

Code: Select all

-- Закрытие фара, меню, удаление файла
Macro { area = 'Shell'; key = 'AltF4'; keys = 'F10' }
Macro { area = 'Shell'; key = 'F10';   keys = 'F9' }
Macro { area = 'Shell'; key = 'Del';   keys = 'F8' }

-- Ввод utf-8 символов
Macro { area = 'Editor'; key = 'CtrlShiftR'; out = '®' }
Macro { area = 'Editor'; key = 'CtrlShiftC'; out = '©' }
Macro { area = 'Editor'; key = 'CtrlShift9'; out = '«' }
Macro { area = 'Editor'; key = 'CtrlShift0'; out = '»' }
Macro { area = 'Editor'; key = 'CtrlShiftSpace'; out = ' ' }
Есть ли какой-либо api, для того чтобы не вносить изменения в utils.lua, и не иметь проблем при обновлении пакета LuaMacro?

Shmuel
Posts: 5097
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 140 times

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

Post by Shmuel » Wed 15 Jul, 2015 06:57

Redisko wrote: Есть ли какой-либо api, для того чтобы не вносить изменения в utils.lua, и не иметь проблем при обновлении пакета LuaMacro?
Такого API нет.
Можно определить свою функцию и поместить её в _macroinit.lua, например:

Code: Select all

local Macro = Macro
function _G.MyMacro(t)
  if t.keys then t.action=function() Keys(t.keys) end; end
  if t.out then t.action=function() print(t.out) end; end
  return Macro(t)
end

Redisko
Posts: 12
Joined: Tue 06 Jul, 2010 13:15
Has thanked: 1 time
Been thanked: 1 time

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

Post by Redisko » Wed 15 Jul, 2015 09:07

Shmuel wrote:Можно определить свою функцию и поместить её в _macroinit.lua, ...
Спасибо, _macroinit.lua — то что надо :)
А вообще, было бы логично нативно поддержать свойство keys, потому как то, что сейчас создается рекордером макросов выглядит не очень:

Code: Select all

code = "Keys(\"p o i u q w e r\")";
Да и большая часть макросов стала бы лаконичнее и читабельнее.

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

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

Post by John Doe » Wed 15 Jul, 2015 10:00

Redisko, вот связанное обсуждение viewtopic.php?f=15&t=8704
Redisko wrote: то, что сейчас создается рекордером макросов выглядит не очень:
Какая разница как это выглядит?

Shmuel
Posts: 5097
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 140 times

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

Post by Shmuel » Mon 26 Oct, 2015 08:06

Как насчёт того, чтобы сделать приоритет по умолчанию для общих (Common) макросов таким же, как у прочих (то-есть 50) ?
Моя практика показывает, что давать им по умолчанию приоритет==40 не имеет смысла, а только усложняет систему и документацию.

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

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

Post by John Doe » Mon 26 Oct, 2015 09:12

При переходе 40 казалось хорошим решением.
Но всё конечно можно вручную отрегулировать при необходимости, для себя не вижу проблемы.

Shmuel
Posts: 5097
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 140 times

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

Post by Shmuel » Tue 27 Oct, 2015 12:48

Кто-нибудь проверяет величину, возвращаемую функцией Macro? Что-нибудь делает с ней?
(Хотелось бы вместо так называемого числа-идентификатора макроса возвращать просто булевое значение).

User avatar
Aidar
Posts: 524
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 7 times
Been thanked: 6 times
Contact:

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

Post by Aidar » Wed 28 Oct, 2015 04:05

В моих макросах нет такой проверки.

gotar
Posts: 293
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

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

Post by gotar » Thu 05 Nov, 2015 22:48

А чем плохо в озвращать Id? Какие пряники от возврата логического значения?

Shmuel
Posts: 5097
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 140 times

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

Post by Shmuel » Thu 05 Nov, 2015 23:14

gotar wrote: А чем плохо в озвращать Id? Какие пряники от возврата логического значения?
Id - это деталь, особенность реализации (англ. термин - "implementation detail"). Id не должен являться частью интерфейса. Завтра внутренняя реализация плагина может измениться, и вообще не будет никакого Id (или же этот Id станет GUID'ом и т.п.).

Пряников для пользователя в этом изменении не предусмотрено. Это просто исправление ошибки, допущенной при разработке интерфейса.

tstr
Posts: 484
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 2 times
Been thanked: 3 times

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

Post by tstr » Sat 14 Nov, 2015 18:37

пытаюсь реализовать сортировку элементов меню плагина DiskMenu по имени.

Code: Select all

local plugDiskMenuGUID = "9A12EB3A-6B5C-416A-B755-A21FDD73C7B2";
local F=far.Flags

Event {
  description = "Sort DiskMenu Menu";
  group="DialogEvent";
  action = function(Event, FarDialogEvent)
    if FarDialogEvent.Msg==F.DN_INITDIALOG and Event == F.DE_DLGPROCINIT then
      FarDialogEvent.hDlg:send(F.DM_LISTSORT,1,0)
    end
  end;
}
список сортируется, но выбирая элемент плагин срабатывает на положение элемента до сортировки.
сама идея принципиально неверна, или можно как-то оповестить плагин о изменении отображения?

Shmuel
Posts: 5097
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 140 times

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

Post by Shmuel » Sat 14 Nov, 2015 18:53

Я плагином этим никогда не пользовался, но рискну предположить:
- плагин не знает, что элементы перетасованы
- элементы перетасованы визуально, а внутренний массив плагина остался нетронутым
- плагин при закрытии меню получает только позицию выбранного элемента на момент закрытия
- по полученной позиции выбираются данные из внутреннего массива

Без модификации плагина ничего с этим сделать не получится.

tstr
Posts: 484
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 2 times
Been thanked: 3 times

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

Post by tstr » Sat 14 Nov, 2015 19:22

так и предполагал, спасибо.

попробую сохранять элементы и при выборе элемента меню по "Return" транслировать на старое расплолжение...

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

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

Post by John Doe » Sun 15 Nov, 2015 14:38

tstr wrote: попробую сохранять элементы и при выборе элемента меню по "Return" транслировать на старое расплолжение...
:-o

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

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

Post by John Doe » Wed 06 Jul, 2016 12:24

Code: Select all

shmuel 14.06.2016 12:35:08 +0200 - build 574

1. LuaFAR: LF_ExitFAR(), после вызова export.ExitFAR(), удаляет все незакрытые таймеры (если таковые
   имеются), что предотвращает падения: (1) на выходе из Far и (2) при пересоздании lua_State
   с помощью _G.RecreateLuaState=true.
Хочу уточнить, в какой мере это относится к luamacro.
Ведь здесь событие ExitFAR вызывается также и при перезагрузке макросов.
Соответственно до сих пор для каждого таймера создавал соответствующий обработчик ExitFAR.
Вопрос: необходимо ли это делать сейчас?
Если да, то как вы относитесь к тому чтобы избавить пользователя от такой необходимости?

Shmuel
Posts: 5097
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 140 times

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

Post by Shmuel » Wed 06 Jul, 2016 12:40

John Doe wrote: Вопрос: необходимо ли это делать сейчас?
Пока что да.
John Doe wrote: как вы относитесь к тому чтобы избавить пользователя от такой необходимости?
Вот это вопрос неоднозначный. Технически это сейчас реализовать легко, а вот нужно ли?

Post Reply

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