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.
    (Мануал весьма лаконичен, вместо описания функции старого макроязыка приведены ссылки на устаревший раздел )
См. также:
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Shmuel »

Latest post of the previous page:

gotar wrote:Посмотрел я на макрос
А что в lua нет стандартных функций проверки является ли символ алфавиноцифровым? Или получения i-того символа строки?
Начало и конец слова над курсором ищется как-то уж совсем в рукопашную. Неужели для этого нет стандартных средств?
Не забывайте о том, что автор макроса только начинает программировать на Lua.
Если вы знаете, как улучшить его макрос, подавайте конкретные предложения.
gotar
Posts: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by gotar »

Честно говоря, я хотел взять этот макрос как образец для подражания. Может знатоки lua подскажут как написал бы этот макрос мастер lua. Какие еще очевидные неэффективности есть в этом макросе?
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Shmuel »

gotar wrote:Честно говоря, я хотел взять этот макрос как образец для подражания. Может знатоки lua подскажут как написал бы этот макрос мастер lua. Какие еще очевидные неэффективности есть в этом макросе?
Мастером Lua себя не считаю, времени анализировать макросы сейчас нет.
О неэффективностях имеет смысл говорить, только если они заметны при исполнении макроса.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Max Rusov »

А как прервать зациклившийся макрос? Раньше - Ctrl-Break помогало, а теперь - только диспетчер задач?
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Shmuel »

Max Rusov wrote:А как прервать зациклившийся макрос? Раньше - Ctrl-Break помогало, а теперь - только диспетчер задач?
Это в TODO есть, но боюсь, что будет не скоро.
User avatar
SUSim
Posts: 1636
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by SUSim »

Не знаете как писать на Lua - жмите ШифтПробел:

Code: Select all

<?xml version="1.0" encoding="UTF-8" ?>
<farconfig>
    <macros>
        <keymacros>
            <macro area="Editor" key="ShiftSpace" flags="DisableOutput" description="Список завершения MacroLua. © SimSU">
                <text>
                    <![CDATA[
--[[1]]--Список завершения MacroLua. © SimSU
-- Назначается, например, на ShiftSpace в редакторе.
Letters="ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz1234567890"
IsLetter=function(Str,I)
  return Letters:find(I>0 and I<=Str:len() and Str:sub(I,I) or " ",1,true) -- s:find("",1,true) виснет/зацикливается при ""
end
--------------------------------------------------------------------------
  Editor.Undo(0)

  InitPos=Editor.RealPos
  s=Editor.Value
  i=InitPos while IsLetter(s,i) do i=i+1 end End=i -- Ищем конец слова c курсором.
  i=InitPos while IsLetter(s,i-1) do i=i-1 end Beg=i -- Ищем начало слова c курсором.
  -- Выделяем найденое слово, если слово не нашли, то выделение просто снимется из-за равенства Beg и End.
  Editor.Pos(1,2,Beg) Editor.Sel(2,0)
  Editor.Pos(1,2,End) Editor.Sel(2,1)
  Editor.Pos(1,2,InitPos)
  -- Если перед словом стоит точка, будем искать таблицы.
  Table={}
  while s:sub(i-1,i-1)=="." and IsLetter(s,i-2) do -- Собираем цепочку таблиц Типа _G._G. ... APanel.
    EndTable=i i=i-1
    while IsLetter(s,i-1) do i=i-1 end
    if i~=EndTable then
      Table[#Table+1]=s:sub(i,EndTable-2)
    end
  end            
  -- Ищем таблицу
  CurTable=_G
  for i=#Table,1,-1 do
    ExistProp=false; for k in pairs(CurTable) do if k==Table[i] then ExistProp=true end end -- type(Area.["dd"]) вызывает ошибку вместо возвращения "nil".
    if ExistProp and type(CurTable[Table[i]])=="table" then
      CurTable=CurTable[Table[i]]
    else
      CurTable=nil
    end
  end
  -- Строим список вариантов.
  Items={}
  if type(CurTable)=="table" then
    for k in pairs(CurTable) do
      local t=type(CurTable[k])
      if t=="table" then Items[#Items+1]=k.."."
      elseif t=="function" then Items[#Items+1]=k.."()"
      else Items[#Items+1]=k
      end
    end
    if CurTable==_G then
      Items[#Items+1]="if then elseif then else end"
      Items[#Items+1]="for in do end"
      Items[#Items+1]="while do end"
      Items[#Items+1]="repeat until "
    end
    if type(CurTable.properties)=="table" then
      for k in pairs(CurTable.properties) do
        Items[#Items+1]=k
      end
    end
  end
  Items=table.concat(Items,"\n")
  -- Выводим меню
  Flags=0x3+0x20+0x100
  Selected=Menu.Show(Items,"\nEnter-выбор",Flags,Editor.SelValue)
  -- Обрабатываем выбор
  if Selected~="" then
    Keys("CtrlD") print(Selected)
  else
    Editor.Sel(4)
  end

  Editor.Undo(1)
]]>
</text>
            </macro>
        </keymacros>
    </macros>
</farconfig>
упростил=минимизировал код, как просили (избавился от ";" применил сокращения-свёртки): скорость работы практически не изменилась, но читабельность, имхо, упала.
расширил=усложнил - теперь макрос понимает вложенные таблицы нескольких уровней: a.a.a....
SimSU ··· ·· -- ··· ··-
User avatar
SUSim
Posts: 1636
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by SUSim »

gotar wrote:Посмотрел я на макрос
А что в lua нет стандартных функций проверки является ли символ алфавиноцифровым? Или получения i-того символа строки?
Начало и конец слова над курсором ищется как-то уж совсем в рукопашную. Неужели для этого нет стандартных средств?
что значит алфавиноцифровым - буквы и цифры, я правильно понял? а буквы какие эта функция должна понимать - буквы английские, русские, греческие? моё упрощение и рукопашность была направлена именно на то, чтобы было понятно и быстро. А стандартные средства очень общи: если бы я использовал поиск слов стандартным способом, то находил бы и слово "хрен", которое, ну ни как не может быть элементом языка...

Решался конкретный вопрос - выделить цепочку символов(латинских букв и арабских цифр плюс символ подчёркивания), а не выделить слово которое может быть и украинским :)
SimSU ··· ·· -- ··· ··-
EGez
Posts: 145
Joined: Thu 04 Oct, 2012 13:53
Location: Hamburg, DE
Has thanked: 2 times
Been thanked: 2 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by EGez »

Доброе время суток,

баги/вылеты по плагину LuaMacro сюда можно сообщать? Что-то я конкретную тему по нему не нашел, пишу тут...

в сборке Far 3.0.2882 при использовании функции mf.mmode(1, x) вылет плагина с последующей его выгрузкой.
FarTrap_20121012200601.log.7z
(8.86 KiB) Downloaded 144 times
Удачи...
User avatar
SUSim
Posts: 1636
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by SUSim »

EGez wrote:баги/вылеты по плагину LuaMacro сюда можно сообщать? Что-то я конкретную тему по нему не нашел, пишу тут...
это не совсем баг спринга, и прежде чем сообщать лучше посмотреть не сообщили уже...
http://forum.farmanager.com/viewtopic.p ... 155#p98842
SimSU ··· ·· -- ··· ··-
2useven10
Posts: 5211
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by 2useven10 »

EGez в шапке темы по ссылке выше написано куда и как надо сообщать об ошибках...
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Max Rusov »

Раньше, если макрос вызывался их области DialogAutoCompletion, то Dlg.Id возвращал GUID диалога, а теперь - пустую строчку. Хотелось бы вернуть старое поведение.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Shmuel »

Max Rusov wrote:Раньше, если макрос вызывался их области DialogAutoCompletion, то Dlg.Id возвращал GUID диалога, а теперь - пустую строчку. Хотелось бы вернуть старое поведение.
Это сломалось совсем недавно, будем смотреть.

Update: исправлено в 2934.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Max Rusov »

А можно как то сделать более толковые сообщения об run-time ошибках? Сейчас получаю:
[string " ..."]:84: attempt to index field 'vRow' (a nil value)
Что такое: string " ..." ? Как найти строку 84?
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Shmuel »

Max Rusov wrote:
[string " ..."]:84: attempt to index field 'vRow' (a nil value)
Что такое: string " ..." ? Как найти строку 84?
Как мне это повторить?
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Max Rusov »

Да вроде любая runtime ошибка так выглядит. Ну, вот, например:

Code: Select all

macro Descr = "Тест ошибки" Key="CtrlAltF12"
{{
  msgbox(aa.bb)
}}

Code: Select all

╔══════════════════════════ LuaMacro ═══════════════════════════╗
║ [string " ..."]:2: attempt to index global 'aa' (a nil value) ║
╟───────────────────────────────────────────────────────────────╢
║                            { OK }                             ║
╚═══════════════════════════════════════════════════════════════╝
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Shmuel »

Это при использовании MacroLib. Возможно, 1-я строка, которая передаётся Lua - пустая.
Вот как без MacroLib:

Code: Select all

C:\>lm:post msgbox(aa.bb)

╔════════════════════════════ LuaMacro ════════════════════════════╗
║ [string "msgbox(aa.bb)"]:1: attempt to index global 'aa' (a nil  ║
║ value)                                                           ║
╟──────────────────────────────────────────────────────────────────╢
║                              { OK }                              ║
╚══════════════════════════════════════════════════════════════════╝
Post Reply

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