2014-09-05 2 views
0

можно установить ограничение времени для чтения ввода в терминал в Lua.LUA. io.read с ограничением по времени

Например, вы используете только 1 секунду, чтобы написать письмо еще раз, пропустите это действие.

спасибо за любой кончик;)

ответ

2

Вы можете сделать это, изменив настройки терминала (см man termios) с помощью luaposix (на машинах POSIX только, очевидно):

local p = require("posix") 

local function table_copy(t) 
    local copy = {} 
    for k,v in pairs(t) do 
    if type(v) == "table" then 
     copy[ k ] = table_copy(v) 
    else 
     copy[ k ] = v 
    end 
    end 
    return copy 
end 

assert(p.isatty(p.STDIN_FILENO), "stdin not a terminal") 

-- derive modified terminal settings from current settings 
local saved_tcattr = assert(p.tcgetattr(p.STDIN_FILENO)) 
local raw_tcattr = table_copy(saved_tcattr) 
raw_tcattr.lflag = bit32.band(raw_tcattr.lflag, bit32.bnot(p.ICANON)) 
raw_tcattr.cc[ p.VMIN ] = 0 
raw_tcattr.cc[ p.VTIME ] = 10 -- in tenth of a second 

-- restore terminal settings in case of unexpected error 
local guard = setmetatable({}, { __gc = function() 
    p.tcsetattr(p.STDIN_FILENO, p.TCSANOW, saved_tcattr) 
end }) 

local function read1sec() 
    assert(p.tcsetattr(p.STDIN_FILENO, p.TCSANOW, raw_tcattr)) 
    local c = io.read(1) 
    assert(p.tcsetattr(p.STDIN_FILENO, p.TCSANOW, saved_tcattr)) 
    return c 
end 

local c = read1sec() 
print("key pressed:", c) 
0

В lcurses (Ncurses для библиотеки Lua) Lua может обеспечить это. Вам нужно будет загрузить и установить его. Существует пример того, как проверить keypress только на Create a function to check for key press in unix using ncurses, он находится на C, но API ncurses идентичен в Lua.

В противном случае вам потребуется создать модуль расширения Lua с использованием C/C++ API: вы должны создать функцию C, которую вы вызываете из Lua, и эта функция C имеет доступ к обычной функции ОС, такой как getch, select, и т. д. (зависит от того, находитесь ли вы в Windows или Linux).

Смежные вопросы