我试过了,c::Char = read(stdin, Char);
它仅在按回车键后从键盘读取字符,但不会在每次按键/释放时读取字符。
请指导我在按键或松开时阅读键盘输入!
更新 1:
function quit()
print("Press q to quit!");
opt = getc1();
while true
if opt = 'q'
break;
else
continue;
end
end
end
抛出错误:
TypeError:non-boolean(Int64) used in boolean context.
请帮帮我!
这不是那么简单。
您可以尝试这个更底层的解决方案:
function getc1()
ret = ccall(:jl_tty_set_mode, Int32, (Ptr{Cvoid},Int32), stdin.handle, true)
ret == 0 || error("unable to switch to raw mode")
c = read(stdin, Char)
ccall(:jl_tty_set_mode, Int32, (Ptr{Cvoid},Int32), stdin.handle, false)
c
end
或者这个更高层次的:
function getc2()
t = REPL.TerminalMenus.terminal
REPL.TerminalMenus.enableRawMode(t) || error("unable to switch to raw mode")
c = Char(REPL.TerminalMenus.readKey(t.in_stream))
REPL.TerminalMenus.disableRawMode(t)
c
end
取决于你需要什么(或者使用这里的想法编写另一个实现)。关键的挑战是"普通密钥"(如 ASCII)始终得到正确处理。但是,解决方案的不同之处在于它们如何处理'ą'
(某些较大的 UNICODE 字符)或UP_ARROW(当您按键盘上的向上箭头时)等字符 - 您在这里必须尝试并决定您想要什么(或者也许足以让您一个接一个地读取UInt8
值并手动重建您想要的内容?
编辑
问题出在您的quit
函数上。以下是它应该如何定义:
function quit()
print("Press q to quit!");
while true
opt = getc1();
if opt == 'q'
break
else
continue
end
end
end
以下示例可能会有所帮助:
import REPL
function wait_for_key( ;
io_in::IO = stdin,
io_out::IO = stdout,
prompt::String = "press any key [d]raw [n]odraw [q]uit : ",
)
print(io_out, prompt)
t = REPL.TerminalMenus.terminal
REPL.Terminals.raw!(t, true)
char = read(io_in, Char)
REPL.Terminals.raw!(t, false)
write(io_out, char)
write(io_out, "n")
return char
end