所以我有了这个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")