STDIN.getch como um evento non block (é possível?) - ruby, io, console, errno

Eu estou tentando ler um personagem instantaneamente a partir da linha de comando sem o uso de Enter. O código ruby ​​(ruby 1.9.3p374) que eu estou usando é o seguinte:

require "io/console"

ch = STDIN.getch
puts ch

até agora tudo está funcionando bem, mas agora eu quero colocar esse código dentro de um loop infinito fazendo algumas outras coisas, algo como

loop do
puts "..doing stuff.."
ch = STDIN.getch
if ch == "q"
break
end
end

mas esse código sempre força a pressionar uma tecla entre cada impressão. Eu quero um comportamento semelhante ao STDIN.read_nonblock método, mas sem ter que pressionar a tecla enter depois de pressionar um char.

Basicamente eu quero imprimir ".. fazer coisas .." até que eu pressione uma determinada tecla no teclado, mas eu não quero usar enter.

Qualquer ajuda será apreciada. obrigado

Respostas:

0 para resposta № 1

Você sempre pode usar o built-in curses biblioteca para lidar com sua interação. É muito poderoso e é usado para construir ferramentas acionadas por teclado, como editores de texto.

A alternativa é usar select para pesquisar se STDIN for legível. Seu terminal pode estar em um estado de buffer de linha, então você precisa ajustar isso antes de receber as únicas teclas digitadas. Isso é algo que as Maldições podem manipular para você.


Cardápio