Чтение входного буфера автоматически после небольшой задержки - PullRequest
0 голосов
/ 05 мая 2019

Итак, я делаю глупую маленькую терминальную игру в качестве упражнения, и я хотел бы, чтобы пользователь мог набирать команды с несколькими символами, например, Vim, где (я полагаю) пользователь нажимает клавишу, а затемпосле последнего нажатия клавиши примерно половина секунды или около того, прежде чем буфер действительно будет прочитан, поэтому я мог набрать d или dd и не нажимать клавишу ввода.

Вопрос в том, как?Я предполагаю, что read_nonblock - это путь сюда, но как бы я его использовал?Сначала я думал поместить его в цикл while с инкрементным таймером и просто сбросить его всякий раз, когда буфер читает что-то новое, но read_nonblock выдает его исключение, когда буфер пуст, так что он не работает ...

Мысли

1 Ответ

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

Хорошо, это то, что я придумал (в основном адаптировано из: это )

$beat = 20
def read_char
  STDIN.echo = false
  STDIN.raw!

  input = STDIN.getc
  value = ""
  t = 0
  while t < $beat do
    started = Time.now
    if input != nil then
      # if input.chr == "\e" then
      #   input << STDIN.read_nonblock(3) rescue nil
      #   input << STDIN.read_nonblock(2) rescue nil
      # end
      value << input.chr
      t = 0
    else
      ended = Time.now
      t += (ended - started)*1000
    end
    input = STDIN.read_nonblock(1) rescue nil
  end
ensure
  STDIN.echo = true
  STDIN.cooked!
  return value
end

Кажется, это работает из самых базовых тестов, которые я выполнилна нем ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...