准备好了吗? (水晶郎)

时间:2019-05-01 06:34:21

标签: crystal-lang

我当前的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链接。

1 个答案:

答案 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