所以我得到了这个用于处理终端中交互式用户输入的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")