Definir o modo não-canônico em stdin com Ruby
Pergunta
Eu estou brincando com fazer um jogo de terminais baseados em simples com Ruby, e atualmente estou tentando chegar a uma maneira de ler a entrada do terminal.
Até agora eu tenho usado gets
, mas eu gostaria de ter o jogo reagir instantaneamente sem a necessidade de uma nova linha (assim você não precisa pressionar uma chave, seguida, ENTER).
Eu descobri que eu preciso para colocar o terminal em modo não-canônico, e eu estou supondo que eu posso fazer isso chamando $stdin.ioctl
. O problema é, eu não tenho certeza do que argumentos ou sinalizadores que eu deveria estar passando a isso, e a documentação e buscas apenas levar a informações sobre a função C subjacente.
Alguém pode me dizer o que eu deveria estar chamando $stdin.ioctl
com? Estou usando Terminal.app/tcsh em OSX Leopard.
Edit: Isto é o que eu acabei usando, graças a MarkusQ:
%x{stty -icanon -echo}
key = STDIN.read(1)
Solução
Seu problema está fora de rubi.
resposta mais fácil:. Envolver seu IO em% x {stty crua echo} e {% x stty crua echo} para alterar o modo com stty
Você provavelmente vai querer fazer e garantir um manipulador de saída para ter certeza o modo é definido de volta quando você sair.
- MarkusQ