如何在朱莉娅的每次击键时读取键盘输入?



我试过了,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

最新更新