我当前的ruby命令行应用程序使用STDIN.ready?。这允许我捕获复杂的键,如元键,功能键,移位功能键等。我在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部件中。我不知道什么时候该停止读钥匙。
以前,在ruby中,我在if STDIN.ready?中有第二个getc。
早些时候在ruby中:
if c == '\e'
loop
if STDIN.ready?
k = STDIN.getc
accumulate in string
else
evaluation string and return code
end
end
end编辑:对我来说,正确的答案在于下面评论中建议的2048.cr的链接。
发布于 2019-05-02 19:27:22
这不是一个答案,如果这里没有正确的答案,这只是一个变通方法。
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
endhttps://stackoverflow.com/questions/55932464
复制相似问题