Skip to content

Instantly share code, notes, and snippets.

@acook
Created December 2, 2012 18:42
Show Gist options
  • Save acook/4190379 to your computer and use it in GitHub Desktop.
Save acook/4190379 to your computer and use it in GitHub Desktop.
Read keypresses from user in terminal, including arrow keys using pure Ruby. This has since been folded into a much more robust gem called Remedy. https://rubygems.org/gems/remedy & https://github.com/acook/remedy
require 'io/console'
# Reads keypresses from the user including 2 and 3 escape character sequences.
def read_char
STDIN.echo = false
STDIN.raw!
input = STDIN.getc.chr
if input == "\e" then
input << STDIN.read_nonblock(3) rescue nil
input << STDIN.read_nonblock(2) rescue nil
end
ensure
STDIN.echo = true
STDIN.cooked!
return input
end
# oringal case statement from:
# http://www.alecjacobson.com/weblog/?p=75
def show_single_key
c = read_char
case c
when " "
puts "SPACE"
when "\t"
puts "TAB"
when "\r"
puts "RETURN"
when "\n"
puts "LINE FEED"
when "\e"
puts "ESCAPE"
when "\e[A"
puts "UP ARROW"
when "\e[B"
puts "DOWN ARROW"
when "\e[C"
puts "RIGHT ARROW"
when "\e[D"
puts "LEFT ARROW"
when "\177"
puts "BACKSPACE"
when "\004"
puts "DELETE"
when "\e[3~"
puts "ALTERNATE DELETE"
when "\u0003"
puts "CONTROL-C"
exit 0
when /^.$/
puts "SINGLE CHAR HIT: #{c.inspect}"
else
puts "SOMETHING ELSE: #{c.inspect}"
end
end
show_single_key while(true)
@Daxx
Copy link

Daxx commented Nov 26, 2014

Very helpful, thank you.

@macmv
Copy link

macmv commented Oct 2, 2015

Awesome! I just downloaded it, and it works great!

@tkovs
Copy link

tkovs commented Apr 3, 2016

Doesn't work on Windows

@blakeyoder
Copy link

Yes, can confirm it doesn't work on Windows, either

@sonjz
Copy link

sonjz commented May 19, 2021

super useful, 🙏

@acook
Copy link
Author

acook commented May 21, 2021

I'm glad this has helped people!

If you discover something that is also broken in Remedy please report it!

@mthunzi99
Copy link

Anyone found the windows solution yet?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment