возможность из Lua писать в консольный буфер FARа

Здесь обсуждается всё, что касается макросов.
tstr
Posts: 513
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 4 times
Been thanked: 5 times

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

Post by tstr » Sat 13 Jul, 2013 12:17

есть ли возможность из Lua писать в консольный буфер FARа без его затирания при восстановлении панелей/экрана, как это делают штатно запускаемые фаром консольные приложения (аналог вызова echo в командном интерпретаторе)?

Shmuel
Posts: 5230
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

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

Post by Shmuel » Sat 13 Jul, 2013 13:40

Похоже, что такой возможности нет (и не только из Lua, а вообще из плагинов), если не считать макросы типа

Code: Select all

lm:post print("dir /w") Keys("Enter")
Буду рад ошибиться.

User avatar
DrKnS
Posts: 4643
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 125 times
Contact:

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

Post by DrKnS » Sat 13 Jul, 2013 14:15

Code: Select all

PanelControl(FCTL_GETUSERSCREEN);
print("hello, world");
PanelControl(FCTL_SETUSERSCREEN);

tstr
Posts: 513
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 4 times
Been thanked: 5 times

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

Post by tstr » Sat 13 Jul, 2013 15:17

спасибо, работает.
  1. function printToFARConsole(txt)
  2.   local hScr;
  3.   panel.GetUserScreen(hScr);
  4.   io.write(txt);
  5.   panel.SetUserScreen(hScr);
  6. end

Shmuel
Posts: 5230
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

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

Post by Shmuel » Sat 13 Jul, 2013 15:57

hScr не играет роли здесь, он игнорируется LuaFAR'ом.
  1. function printToFARConsole(...)
  2.   panel.GetUserScreen()
  3.   io.write(...)
  4.   io.write("\n")
  5.   panel.SetUserScreen()
  6. end
И вылезла попутно одна проблема: io.write не выводит правильно в консоль текст в UTF-8.

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

Не могу найти определение функции error из checkarg

Post by gotar » Tue 16 Jul, 2013 14:00

Почитавши форум накатал две функции
  1. function printToFARConsole(...)
  2.   panel.GetUserScreen()
  3.   io.write(...)
  4.   io.write("\n")
  5.   panel.SetUserScreen()
  6. end
  7. _G.сprint=printToFARConsole
  8.  
  9. local function checkarg (arg, argnum, reftype)
  10.   if type(arg) ~= reftype then
  11. --    error(("arg. #%d: %s expected, got %s"):format(argnum, reftype, type(arg)), 3)
  12.   end
  13. end
  14.  
  15.  
  16. function _G.сprintf (fmt, ...)
  17.   checkarg(fmt,1,"string")
  18.   return _G.сprint(fmt:format(...))
  19. end
для вывода на экран. Я, конечно слепой, но не смог найти определение функции error даже контекстным поиском по всем исходникам luamacro. Помогите найти!

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

Re: Не могу найти определение функции error из checkarg

Post by John Doe » Tue 16 Jul, 2013 14:05

http://www.lua.org/manual/5.1/manual.html#pdf-error

P.S.
Учитывайте также что основой LuaMacro является библиотека LuaFAR

tstr
Posts: 513
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 4 times
Been thanked: 5 times

Re: Не могу найти определение функции error из checkarg

Post by tstr » Tue 16 Jul, 2013 14:22

немного оффтоп, но касательно функции printToFARConsole:
создавал внешний процесс, получал от него консольный вывод, отправлял в юзерскрин этот вывод. при убиении процесса получал ошибку lua (аля должен быть параметр для io.write а получен nil), обошел введением дополнительной проверки как-то так:
  1. function printToFARConsole(...)
  2.     local parT = ...
  3.     if parT~= nil then
  4.       panel.GetUserScreen()
  5.       io.write(...)
  6.       io.write("\n")
  7.       panel.SetUserScreen()
  8.     end
  9. end

Shmuel
Posts: 5230
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

Re: Не могу найти определение функции error из checkarg

Post by Shmuel » Tue 16 Jul, 2013 14:28

Раз пошла такая пьянка, вот модификация, которая позволяет (у меня по крайней мере) выводить и русский текст, если на входе UTF-8. "Чисто юникодные" символы, естественно, таким путём не выведешь.
  1. function printToFARConsole(...)
  2.   local OemCp = win.GetOEMCP()
  3.   panel.GetUserScreen()
  4.   for k=1, select("#",...) do
  5.     local s = select(k,...)
  6.     s = win.WideCharToMultiByte(win.Utf8ToUtf16(s),OemCp)
  7.     io.write(s)
  8.   end
  9.   io.write("\n")
  10.   panel.SetUserScreen()
  11. end

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

Re: userscreen под панелями — отдельное окно ("Desktop")

Post by gotar » Sat 23 Aug, 2014 12:18

А как выводить информациию на этот desktop из Lua макросов? Может быть у кого нибудь уже есть готовый код.

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

print должен выводить в Console, а не в буфер клавиатуры Far

Post by gotar » Tue 26 Aug, 2014 17:26

Многие ли пользуются функцией print? Предлагаю сделать поведение функции print более похожим на print в обычном lua, т.е. print мог бы выводить информацию на Descktop (ConsoleOutput), а не повторять функциональность Keys. Такое поведение ломает совместимость, однако я не думаю что кто-то в макросах использовал текущую версию print.

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

Re: print должен выводить в Console, а не в буфер клавиатуры

Post by John Doe » Tue 26 Aug, 2014 17:42

print не повторяет функциональность Keys

User avatar
Wave
Posts: 1721
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 2 times
Been thanked: 10 times

Re: print должен выводить в Console, а не в буфер клавиатуры

Post by Wave » Tue 26 Aug, 2014 18:44

Как раз очень много в макросах принта. Одно дело написать print("some command") и другое Keys("s o m e space c o m m a n d")
А уж в случае с макросами аналогами truetemplate…
Пользуюсь ФАРом больше 15 лет © собирательный.

Shmuel
Posts: 5230
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

Re: userscreen под панелями — отдельное окно ("Desktop")

Post by Shmuel » Wed 27 Aug, 2014 10:38

gotar wrote:А как выводить информациию на этот desktop из Lua макросов? Может быть у кого нибудь уже есть готовый код.
Смотрите мануал LuaFAR, panel.GetUserScreen, panel.SetUserScreen. Там и пример имеется.

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

возможность из Lua писать в консольный буфер FARа

Post by gotar » Wed 27 Aug, 2014 13:30

Как что то записать на экран Desktopa?
Мой план:
1. Сохранить номер текущего окна
2. Переключиться в нулевое окно
3. Записать информацию на стандартный вывод
4. Ввостановить текущее окно

полностью провалился

На всякий случай привожу текст скрипта
  1. _G.sprint = function(...)
  2. pos=far.AdvControl("ACTL_GETWINDOWINFO").Pos
  3. -- if ( far.AdvControl("ACTL_GETWINDOWINFO",1).Type ~= 0) then  ErrMsg(tostring((...)),"Desktop") return end
  4. far.AdvControl("ACTL_SETCURRENTWINDOW",1)
  5. far.AdvControl("ACTL_COMMIT")
  6. luaprint(...)
  7. far.AdvControl("ACTL_SETCURRENTWINDOW",pos)
  8. far.AdvControl("ACTL_COMMIT")
  9. end
  10. sprint("point 1\n")
  11. win.Sleep(3000)
  12. sprint("point 2\n")
COMMIT по всей видимости не нужен. Я его сделал с горя. luaprint - стандартный print до его переопределения в LuaMacro.

User avatar
HaRT
Moderator
Posts: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

Post by HaRT » Wed 27 Aug, 2014 13:41

gotar
Ну не Desktop это! Пожалуйста, не надо использовать это неудачное название.
Обсуждение там.
Фар есть инструмент, а не нянька. © 2009 DrKnS

Post Reply

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