所以我有了这个lua测试脚本来处理终端中的交互式用户输入 . 它按预期工作,除了我无法找到一种方法来清除调用io.read(1)之间的输入缓冲区 .
在你说之前,不,curses不是一个选项,也不是任何第三方库 . 这个脚本(当它完成时)将在具有固定固件的嵌入式设备上使用,因此纯lua是唯一的选择 .
代码:
UP = 65
DOWN = 66
RIGHT = 67
LEFT = 68
local function sleep(seconds)
os.execute("sleep " .. tonumber(seconds));
end
local function write(String)
io.write(String);
io.flush();
end
local key = {
[27] = function()
group = (io.read(1)):byte();
if group == 91 then
direction = (io.read(1)):byte();
if direction == UP then return write("Up") end
if direction == DOWN then return write("Down") end
if direction == RIGHT then return write("Right") end
if direction == LEFT then return write("Left") end
return write("("..direction..")");
end
return write("("..direction..")");
end,
[113] = function() running = false end
}
running = true;
os.execute("stty raw -echo");
while running do
local k = io.read(1);
if k == 'w' then break end
k = k:byte();
if key[k] then key[k]();
else write('('..k..')') end
sleep(.25);
-- while io.read(1) ~= nil do end -- This blocks indefinitely
end
os.execute("stty sane")