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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13847
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Latest post of the previous page:

Есть такой макрос:

Code: Select all

Macro {
  area="Shell"; key="CtrlF1"; priority=100;
  action=function()
    far.Show(mf.akey(1,1))
  end;
}
При нажатии LCtrlF1 вижу CtrlF1
А при запуске lua:eval("LCtrlF1",2) вижу LCtrlF1.
Не совпадает (насколько я понимаю в фаре правильное наименование комбинации с левым модификатором это CtrlF1)

Примечание модератора Смежная тема: http://forum.farmanager.com/viewtopic.php?f=15&t=9496
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

John Doe wrote:Запуск lua: mf.postmacro(eval,"F1") приводит к ошибке "bad argument #1 to 'getfenv' (invalid level)"
Это поправил.
John Doe wrote: Не совпадает (насколько я понимаю в фаре правильное наименование комбинации с левым модификатором это CtrlF1)
Это поправить будет несколько сложнее. Можно на мантис, чтоб не забылось.
User avatar
John Doe
Бюрократ
Posts: 13847
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Shmuel wrote: Можно на мантис, чтоб не забылось.
Может позже, т.к. ещё не понял где это реально может мешать.
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

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

Post by ccaid »

Shmuel wrote: Macro { description="Calculator"; area="Editor"; key="ShiftF1"; --flags="EVSelection";
action=function() result = nil eval(Editor.SelValue) far.CopyToClipboard(tostring(result)) end; }
между 4306 и 4310 этот макрос сломался. баг или его надо обновить?
Фар делают добрые люди
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

Это не баг, но макрос полагался на одну недокументированную фичу, которая была убрана, поэтому макрос перестал работать.
Предлагаю вам другой макрос взамен прежнего:
-- Если нет выделения, обрабатывает текущую строку, иначе - выделение
-- Результат должен быть помещён пользователем в переменную R
-- Можно пользоваться функциями библиотеки math без префикса math.
-- Можно добавить свои функции
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

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

Post by ccaid »

спасибо, буду изучать
Фар делают добрые люди
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

Макрос немного отредактирован (улучшен).
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

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

Post by ccaid »

возникли вопросы.
не удается заменить R на другое имя. оно где-то "внутри" жестко зашито?
можно пример добавления своей функции?
насколько я понял, вычисление выражения происходит в момент tostring(Env.R), это штатная работа языка луа?
Фар делают добрые люди
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

ccaid wrote: не удается заменить R на другое имя. оно где-то "внутри" жестко зашито?
Нигде не зашито, кроме этого скрипта. Что-то меняете не так. Можно выбрать другое имя.
И не забывать перезагружать макросы после любого изменения в макрофайле.
ccaid wrote: можно пример добавления своей функции?
function Env.hex(num) return (("0x%X"):format(tonumber(num))) end
Вызывать просто hex(12345).
ccaid wrote: насколько я понял, вычисление выражения происходит в момент tostring(Env.R), это штатная работа языка луа?
Нет, вычисление происходит в строке
setfenv(f, Env)() - это вызов функции f. Да, это штатная работа Lua.
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

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

Post by ccaid »

спасибо, со всем разобрался.
добавлю, вызов функции f — это последние две скобки в процитированном фрагменте. для человека, который луа видит эпизодически, это не так очевидно. некоторое время пришлось помедитировать над "установкой окружения".
Фар делают добрые люди
User avatar
John Doe
Бюрократ
Posts: 13847
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Shmuel wrote: макрос полагался на одну недокументированную фичу, которая была убрана
Суть фичи была в том, что выражение, выполняемое посредством eval работало в той же среде, откуда вызывался сам eval.
Таким образом в выражении были доступны переменные и функции, определённые в этой среде.
Причём выполняя выражение можно было и изменить среду.

Мне кажется что старое поведение eval хоть и не документировано, но было ожидаемо (и соответствовало старому макроязыку).
И без этого полезность eval(x,0) сильно ограничивается.

Собственно это меня устраивает, ведь есть стандартные средства lua (которые и использованы в новой версии макроса).
Хочу поставить другой вопрос: раз мы больше не цепляемся за совместимость, то нужен ли вообще eval в режимах 0/1/3?
Предлагаю выбросить.
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

John Doe wrote: Мне кажется что старое поведение eval хоть и не документировано, но было ожидаемо (и соответствовало старому макроязыку).
Восстановлено старое поведение.
John Doe wrote: раз мы больше не цепляемся за совместимость, то нужен ли вообще eval в режимах 0/1/3?
Предлагаю выбросить.
Выкидывание каких-то режимов какой-то одной функции нам ничего не даст, кроме постов на форуме, что макросы перестали работать. Если когда нибудь затеем общую переделку, тогда и это можно будет изменить.
User avatar
John Doe
Бюрократ
Posts: 13847
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Shmuel wrote: Выкидывание каких-то режимов какой-то одной функции[...]
Собственно предлагается удалить функцию целиком.
Режимы 0/1/3 вряд ли кто сейчас использует, а если и найдутся такие, то легко предложить замену.
Вместо режима 2 реализовать 2581, или специализированную функцию.
Shmuel wrote:[...]ничего не даст, кроме постов на форуме, что макросы перестали работать.
Можно действовать как с macro:post и mf.GetConfig, т.е. реализовать новую функциональность параллельно, после чего дать достаточное время на переход.
Shmuel wrote: Если когда нибудь затеем общую переделку, тогда и это можно будет изменить.
Будет ли одна большая переделка менее болезненной, чем несколько маленьких?
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

John Doe wrote: Будет ли одна большая переделка менее болезненной, чем несколько маленьких?
Дело не столько в болезненности, сколько в единоразовости. У меня нет ни времени, ни желания заниматься мелкими многочисленными вопросами.
User avatar
John Doe
Бюрократ
Posts: 13847
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Shmuel wrote: У меня нет ни времени, ни желания заниматься мелкими многочисленными вопросами.
С этим не поспоришь.
(Хотя лично мне проще решать мелкие вопросы по одному)
Post Reply

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