0.0
No release in over a year
Read characters from the console and map special keys to symbols
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 10.0
~> 3.0
 Project Readme

KeyboardMap

Process key-presses and map escape-sequences to symbols.

E.g instead of getting ASCII 0x03 you'll get :ctrl_c

Dealing with raw keyboard input is painful because something like cursor-up can return several different sequences depending on terminal, and because there is no terribly simple algorithm determining what represents the end of a single sequence. In fact some software relies on key-presses being slow enough to set a timeout and read character by character.

KeyboardMap allows you to handle the reads in whichever way you prefer. It simply provides a simple state machine that will return an array of the keyboard events found so far.

Current state

This is currently usable and I rely on it daily in my personal editor, which uses this gem for keyboard processing.

However there are many missing sequences (PR's welcome), and it's likely that it will misreport sequences for certain terminals (PR's also welcome), so use with some caution.

Eventually it's likely it will need to deal with termcaps etc., but at the moment I'm "cheating" and relying on the fact that most modern terminals support a mostly shared subset of VT100.

You can use the example in examples/example.rb to get an idea of what your terminal returns for a given keyboard sequence. If you run into problems, please include the output from that when filing an issue, combined with your expected result.

Installation

Add this line to your application's Gemfile:

gem 'keyboard_map'

And then execute:

$ bundle

Or install it yourself as:

$ gem install keyboard_map

Usage

See a full example in examples/example.rb, but the basics:

require 'bundler'
require 'io/console'
require 'keyboard_map'

kb = KeyboardMap.new

IO.console.raw do # You want to get individual keypresses.
  loop do
    ch = $stdin.getc

    # events can include zero or more events.
    # Zero events will happen if the character
    # is part of a compound sequence

    events = kb.call(ch)
    events.each do |e|
      # Process events here.
      p e
    end
  end
end

But I want to catch "Esc"

If you're sure you've read a complete sequence, you can do this by passing :finished as a second argument to call, or by calling the #finish method. You can see this done in examples/example.rb

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/vidarh/keyboard_map.

License

The gem is available as open source under the terms of the MIT License.