Page 30 of 40

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

Posted: Mon 16 Jul, 2012 13:44
by John Doe
Проект Spring (обсуждение) влился в стабильную версию Far Manager 3.0.

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

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

Posted: Tue 23 Jun, 2015 15:32
by Shmuel

Latest post of the previous page:

На мантис.

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

Posted: Tue 14 Jul, 2015 23:59
by Redisko
В файле 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?

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

Posted: Wed 15 Jul, 2015 06:57
by Shmuel
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

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

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

Code: Select all

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

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

Posted: Wed 15 Jul, 2015 10:00
by John Doe
Redisko, вот связанное обсуждение http://forum.farmanager.com/viewtopic.php?f=15&t=8704
Redisko wrote: то, что сейчас создается рекордером макросов выглядит не очень:
Какая разница как это выглядит?

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

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

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

Posted: Mon 26 Oct, 2015 09:12
by John Doe
При переходе 40 казалось хорошим решением.
Но всё конечно можно вручную отрегулировать при необходимости, для себя не вижу проблемы.

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

Posted: Tue 27 Oct, 2015 12:48
by Shmuel
Кто-нибудь проверяет величину, возвращаемую функцией Macro? Что-нибудь делает с ней?
(Хотелось бы вместо так называемого числа-идентификатора макроса возвращать просто булевое значение).

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

Posted: Wed 28 Oct, 2015 04:05
by Aidar
В моих макросах нет такой проверки.

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

Posted: Thu 05 Nov, 2015 22:48
by gotar
А чем плохо в озвращать Id? Какие пряники от возврата логического значения?

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

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

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

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

Posted: Sat 14 Nov, 2015 18:37
by tstr
пытаюсь реализовать сортировку элементов меню плагина 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;
}
список сортируется, но выбирая элемент плагин срабатывает на положение элемента до сортировки.
сама идея принципиально неверна, или можно как-то оповестить плагин о изменении отображения?

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

Posted: Sat 14 Nov, 2015 18:53
by Shmuel
Я плагином этим никогда не пользовался, но рискну предположить:
- плагин не знает, что элементы перетасованы
- элементы перетасованы визуально, а внутренний массив плагина остался нетронутым
- плагин при закрытии меню получает только позицию выбранного элемента на момент закрытия
- по полученной позиции выбираются данные из внутреннего массива

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

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

Posted: Sat 14 Nov, 2015 19:22
by tstr
так и предполагал, спасибо.

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

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

Posted: Sun 15 Nov, 2015 14:38
by John Doe
tstr wrote: попробую сохранять элементы и при выборе элемента меню по "Return" транслировать на старое расплолжение...
:-o

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

Posted: Wed 06 Jul, 2016 12:24
by John Doe

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.
Вопрос: необходимо ли это делать сейчас?
Если да, то как вы относитесь к тому чтобы избавить пользователя от такой необходимости?