STDIN.ready? (Кристалл-лан) - PullRequest
0 голосов
/ 01 мая 2019

Мое текущее приложение командной строки ruby ​​использует STDIN.ready?.Это позволяет мне захватывать сложные клавиши, такие как мета-клавиши, функциональные клавиши, сдвинутые функциональные клавиши и т. Д. Я не нахожу ничего похожего в Crystal.

При поиске я обнаружил STDIN.raw &.read_char.Согласно документации, это должно вернуть ноль, когда нечего читать.Тем не менее, я не получаю ноль.Кажется, ждать следующего ключа.У кода ruby ​​было $stdin.getc.

Моя логика в основном продолжает читать STDIN, пока он готов и накапливает коды клавиш.Момент ready? возвращает ложь, ключ оценивается.

Логика ТЕПЕРЬ:

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 ​​у меня был второй getc внутри if STDIN.ready?.

Ранее в 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, предложенной ниже в комментарии.

1 Ответ

1 голос
/ 02 мая 2019

Это не ответ, это просто обходной путь, если здесь нет правильных ответов.

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
...