Page 1 of 3
возможность из Lua писать в консольный буфер FARа
Posted: Sat 13 Jul, 2013 12:17
by tstr
есть ли возможность из Lua писать в консольный буфер FARа без его затирания при восстановлении панелей/экрана, как это делают штатно запускаемые фаром консольные приложения (аналог вызова echo в командном интерпретаторе)?
Re: LuaMacro — Lua как язык макросов
Posted: Sat 13 Jul, 2013 13:40
by Shmuel
Похоже, что такой возможности нет (и не только из Lua, а вообще из плагинов), если не считать макросы типа
Code: Select all
lm:post print("dir /w") Keys("Enter")
Буду рад ошибиться.
Re: LuaMacro — Lua как язык макросов
Posted: Sat 13 Jul, 2013 14:15
by DrKnS
Code: Select all
PanelControl(FCTL_GETUSERSCREEN);
print("hello, world");
PanelControl(FCTL_SETUSERSCREEN);
Re: LuaMacro — Lua как язык макросов
Posted: Sat 13 Jul, 2013 15:17
by tstr
спасибо, работает.
function printToFARConsole(txt)
local hScr;
panel.GetUserScreen(hScr);
io.write(txt);
panel.SetUserScreen(hScr);
end
Re: LuaMacro — Lua как язык макросов
Posted: Sat 13 Jul, 2013 15:57
by Shmuel
hScr не играет роли здесь, он игнорируется LuaFAR'ом.
function printToFARConsole(...)
panel.GetUserScreen()
io.write(...)
io.write("\n")
panel.SetUserScreen()
end
И вылезла попутно одна проблема: io.write не выводит правильно в консоль текст в UTF-8.
Не могу найти определение функции error из checkarg
Posted: Tue 16 Jul, 2013 14:00
by gotar
Почитавши форум накатал две функции
function printToFARConsole(...)
panel.GetUserScreen()
io.write(...)
io.write("\n")
panel.SetUserScreen()
end
_G.сprint=printToFARConsole
local function checkarg (arg, argnum, reftype)
if type(arg) ~= reftype then
-- error(("arg. #%d: %s expected, got %s"):format(argnum, reftype, type(arg)), 3)
end
end
function _G.сprintf (fmt, ...)
checkarg(fmt,1,"string")
return _G.сprint(fmt:format(...))
end
для вывода на экран. Я, конечно слепой, но не смог найти определение функции error даже контекстным поиском по всем исходникам luamacro. Помогите найти!
Re: Не могу найти определение функции error из checkarg
Posted: Tue 16 Jul, 2013 14:05
by John Doe
http://www.lua.org/manual/5.1/manual.html#pdf-error
P.S.
Учитывайте также что основой LuaMacro является библиотека LuaFAR
Re: Не могу найти определение функции error из checkarg
Posted: Tue 16 Jul, 2013 14:22
by tstr
немного оффтоп, но касательно функции printToFARConsole:
создавал внешний процесс, получал от него консольный вывод, отправлял в юзерскрин этот вывод. при убиении процесса получал ошибку lua (аля должен быть параметр для io.write а получен nil), обошел введением дополнительной проверки как-то так:
function printToFARConsole(...)
local parT = ...
if parT~= nil then
panel.GetUserScreen()
io.write(...)
io.write("\n")
panel.SetUserScreen()
end
end
Re: Не могу найти определение функции error из checkarg
Posted: Tue 16 Jul, 2013 14:28
by Shmuel
Раз пошла такая пьянка, вот модификация, которая позволяет (у меня по крайней мере) выводить и русский текст, если на входе UTF-8. "Чисто юникодные" символы, естественно, таким путём не выведешь.
function printToFARConsole(...)
local OemCp = win.GetOEMCP()
panel.GetUserScreen()
for k=1, select("#",...) do
local s = select(k,...)
s = win.WideCharToMultiByte(win.Utf8ToUtf16(s),OemCp)
io.write(s)
end
io.write("\n")
panel.SetUserScreen()
end
Re: userscreen под панелями — отдельное окно ("Desktop")
Posted: Sat 23 Aug, 2014 12:18
by gotar
А как выводить информациию на этот
desktop из Lua макросов? Может быть у кого нибудь уже есть готовый код.
print должен выводить в Console, а не в буфер клавиатуры Far
Posted: Tue 26 Aug, 2014 17:26
by gotar
Многие ли пользуются функцией print
? Предлагаю сделать поведение функции print более похожим на print в обычном lua, т.е. print мог бы выводить информацию на Descktop (ConsoleOutput), а не повторять функциональность Keys
. Такое поведение ломает совместимость, однако я не думаю что кто-то в макросах использовал текущую версию print
.
Re: print должен выводить в Console, а не в буфер клавиатуры
Posted: Tue 26 Aug, 2014 17:42
by John Doe
print не повторяет функциональность Keys
Re: print должен выводить в Console, а не в буфер клавиатуры
Posted: Tue 26 Aug, 2014 18:44
by Wave
Как раз очень много в макросах принта. Одно дело написать print("some command") и другое Keys("s o m e space c o m m a n d")
А уж в случае с макросами аналогами truetemplate…
Re: userscreen под панелями — отдельное окно ("Desktop")
Posted: Wed 27 Aug, 2014 10:38
by Shmuel
gotar wrote:А как выводить информациию на этот desktop из Lua макросов? Может быть у кого нибудь уже есть готовый код.
Смотрите мануал LuaFAR, panel.GetUserScreen, panel.SetUserScreen. Там и пример имеется.
возможность из Lua писать в консольный буфер FARа
Posted: Wed 27 Aug, 2014 13:30
by gotar
Как что то записать на экран Desktopa?
Мой план:
1. Сохранить номер текущего окна
2. Переключиться в нулевое окно
3. Записать информацию на стандартный вывод
4. Ввостановить текущее окно
полностью провалился
На всякий случай привожу текст скрипта
_G.sprint = function(...)
pos=far.AdvControl("ACTL_GETWINDOWINFO").Pos
-- if ( far.AdvControl("ACTL_GETWINDOWINFO",1).Type ~= 0) then ErrMsg(tostring((...)),"Desktop") return end
far.AdvControl("ACTL_SETCURRENTWINDOW",1)
far.AdvControl("ACTL_COMMIT")
luaprint(...)
far.AdvControl("ACTL_SETCURRENTWINDOW",pos)
far.AdvControl("ACTL_COMMIT")
end
sprint("point 1\n")
win.Sleep(3000)
sprint("point 2\n")
COMMIT по всей видимости не нужен. Я его сделал с горя.
luaprint
- стандартный
print
до его переопределения в LuaMacro.