Hi there,
I am new to using Ruby and I am writing my first real programs and I
have something I was wonndering about:
I have a menu that I would like users to respond to simply by entering a
single character. I have tried both STDIN.getc and gets, but both
require a carriage return. Is there a command I haven’t found that will
actively read STDIN to process a single character as soon as it is
entered?
Thanks in advance,
Keith
Barr, Keith wrote:
Hi there,
I am new to using Ruby and I am writing my first real programs and I have something I was wonndering about:
I have a menu that I would like users to respond to simply by entering a single character. I have tried both STDIN.getc and gets, but both require a carriage return. Is there a command I haven’t found that will actively read STDIN to process a single character as soon as it is entered?
Thanks in advance,
Keith
This is a common question. You need a library (gem) that provides this
function. I have heard that highline, ncurses, and termios have this. In
ncurses, it’s called “getch”, but I don’t know about the others.
Dan
On Aug 25, 2007, at 3:36 PM, Dan Z. wrote:
Keith
This is a common question. You need a library (gem) that provides
this function. I have heard that highline, ncurses, and termios
have this. In ncurses, it’s called “getch”, but I don’t know about
the others.
Here’s how you do it with HighLine:
http://blog.grayproductions.net/articles/i_just_want_one_character
James Edward G. II
Hi,
Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William J.:
On Aug 25, 3:05 pm, “Barr, Keith” [email protected] wrote:
I have a menu that I would like users to respond to
simply by entering a single character.
def getkey
select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
end
Why `c=´? Why twice?
It doesn’t work here; it still waits for the enter key.
I doubt whether there is any other way than using termios.
Bertram
On Aug 25, 3:05 pm, “Barr, Keith” [email protected] wrote:
soon as it is entered?
if RUBY_PLATFORM =~ /win32/
require ‘Win32API’
Kbhit = Win32API.new(“msvcrt”, “_kbhit”, [], ‘I’)
Getch = Win32API.new(“msvcrt”, “_getch”, [], ‘I’)
def getkey
sleep 0.01
return nil if Kbhit.call.zero?
c = Getch.call
c = Getch.call + 256 if c.zero? || c == 0xE0
c
end
else
def getkey
select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
end
end
5.times{
begin end until key = getkey
print key.chr
}
Bertram S. wrote:
Hi,
Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William J.:
On Aug 25, 3:05 pm, “Barr, Keith” [email protected] wrote:
I have a menu that I would like users to respond to
simply by entering a single character.
def getkey
select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
end
Why `c=´? Why twice?
It doesn’t work here; it still waits for the enter key.
I doubt whether there is any other way than using termios.
Bertram
It means if select( [$stdin], nil, nil, 0.01 ) return true,
then c = $stdin.getc; otherwise c = nil.
On Aug 25, 7:16 pm, Bertram S. [email protected] wrote:
end
Why `c=´? Why twice?
Don’t ask me; it’s not my code.
It doesn’t work here; it still waits for the enter key.
It works here under windoze; I can’t test it under unix.
Hi,
Am Sonntag, 26. Aug 2007, 15:15:04 +0900 schrieb William J.:
On Aug 25, 7:16 pm, Bertram S. [email protected] wrote:
Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William J.:
def getkey
select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
end
It doesn’t work here; it still waits for the enter key.
It works here under windoze; I can’t test it under unix.
That was what I meant: You did not test it on a POSIX
system.
You wrote:
if RUBY_PLATFORM =~ /win32/
[…]
else
def getkey
select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
end
end
As long as there are no parsing errors this alway works
under Windows. I tested it under Linux and there, it doesn’t
work.
Bertram
On Aug 26, 2007, at 9:32 AM, Bertram S. wrote:
It means if select( [$stdin], nil, nil, 0.01 ) return true,
then c = $stdin.getc; otherwise c = nil.
The variable c will not be used and the assignment is
mentioned twice. Besides that it is questionable whether an
assignment in a ?: expression will parse how the author
intended.
That the function will return `true’ is just a lie.
Bertram
Bertram, no need for inflamatory statements. Calling something ‘just
a lie’ implies that the person is maliciously trying to spread false
information. It might be more appropriate to simply say that it is a
mistake and explain why.
Hi,
Am Sonntag, 26. Aug 2007, 10:05:07 +0900 schrieb Wai T.:
Bertram S. wrote:
Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William J.:
On Aug 25, 3:05 pm, “Barr, Keith” [email protected] wrote:
select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
Why `c=´? Why twice?
It means if select( [$stdin], nil, nil, 0.01 ) return true,
then c = $stdin.getc; otherwise c = nil.
The variable c will not be used and the assignment is
mentioned twice. Besides that it is questionable whether an
assignment in a ?: expression will parse how the author
intended.
That the function will return `true’ is just a lie.
Bertram