我当前的ruby命令行应用程序使用STDIN.ready?
。这使我可以捕获复杂的键,例如Meta键,Function键,转移功能键等。
我在Crystal中找不到任何类似的东西。
在搜索时,我发现了STDIN.raw &.read_char
。
根据文档,当没有内容可读取时,这应该返回nil。但是,我没有得到零。似乎正在等待下一个键。红宝石代码有一个$stdin.getc
。
只要准备好并存储键码,我的逻辑基本上就一直读取STDIN。 ready?
返回false时,将评估密钥。
现在的逻辑是:
c = STDIN.raw &.read_char
if c == '\e' # escape char
loop do
k = STDIN.raw &.read_char
if k
# accumulate k into a string
else
# evaluate string and return
end
end #loop
end
# rest of code if not escape.
当前else
条件没有执行,因此我陷入了if
部分。我不知道什么时候停止阅读按键。
以前,在红宝石中,我在getc
中有第二个if STDIN.ready?
。
早期的红宝石:
if c == '\e'
loop
if STDIN.ready?
k = STDIN.getc
accumulate in string
else
evaluation string and return code
end
end
end
编辑:对我来说,正确的答案在于下面的注释中建议的2048.cr链接。
答案 0 :(得分:1)
这不是答案,如果这里没有正确的答案,这只是一种解决方法。
def handle_second_key(buffer)
loop do
input = STDIN.raw &.read_char
buffer << input if input
if buffer.size == 2
if buffer[0] == '\e' && buffer[1] == 'q'
puts "Right combination #{buffer[0].dump} + #{buffer[1].dump}"
exit
else
puts "Wrong combination: #{buffer[0].dump} + #{buffer[1].dump}"
break
end
end
end
end
buffer = [] of Char
loop do
input = STDIN.raw &.read_char
buffer << input if input
if buffer[0] == '\e'
handle_second_key(buffer)
buffer.clear
else
buffer.clear if buffer.size > 0
end
end