如何在 julia 的每次击键时读取键盘输入?

AVA*_*AVA 2 input julia

我试过, c::Char = read(stdin, Char);

它仅在按下 Enter 键后才从键盘读取字符,而不是在每次按下/松开时。

请指导我在按下或松开按键时阅读键盘输入!

更新 1:

function quit()
print("Press q to quit!");
opt = getc1();
    while true
       if opt = 'q'
            break;
        else
            continue;
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

抛出错误:

TypeError:non-boolean(Int64) used in boolean context.
Run Code Online (Sandbox Code Playgroud)

请帮我!

Bog*_*ski 5

这不是那么简单。

你可以试试这个更底层的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

或者这个更高的级别:

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
Run Code Online (Sandbox Code Playgroud)

取决于您的需要(或使用此处的想法编写另一个实现)。关键的挑战是“普通密钥”,如 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
Run Code Online (Sandbox Code Playgroud)