можно установить ограничение времени для чтения ввода в терминал в Lua.LUA. io.read с ограничением по времени
Например, вы используете только 1 секунду, чтобы написать письмо еще раз, пропустите это действие.
спасибо за любой кончик;)
можно установить ограничение времени для чтения ввода в терминал в Lua.LUA. io.read с ограничением по времени
Например, вы используете только 1 секунду, чтобы написать письмо еще раз, пропустите это действие.
спасибо за любой кончик;)
Вы можете сделать это, изменив настройки терминала (см 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)
В 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).