views:

502

answers:

1

I'm playing around with making a simple terminal-based game with Ruby, and I'm currently trying to come up with a way of reading input from the terminal.

So far I've been using gets, but I'd like to have the game react instantly without requiring a newline (so you don't need to press a key, THEN enter).

I've figured out I need to put the terminal in non-canonical mode, and I'm assuming I can do that by calling $stdin.ioctl. The problem is, I'm not sure what arguments or flags I should be passing to this, and the documentation and searches just lead to information about the underlying C function.

Can anyone tell me what I should be calling $stdin.ioctl with? I'm using Terminal.app/tcsh on OSX Leopard.

Edit: This is what I ended up using, thanks to MarkusQ:

%x{stty -icanon -echo}
key = STDIN.read(1)
+2  A: 

Your problem is outside of ruby.

Easiest answer: wrap your IO in %x{stty -raw echo} and %x{stty -raw echo} to change the mode with stty.

You'll probably want to do and ensure an exit handler to make certain the mode is set back when you exit.

-- MarkusQ

MarkusQ
You got me on the right track with the stty information. Looked it and found what I needed. Thanks!
Luke