Stringifies key objects emitted by nodejs readline.
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.

stringify-key build status

Stringifies key objects emitted by nodejs readline.

Counter part to parse key.


npm i stringify-key


  var stringifyKey = require('stringify-key');

  var key =  { name: 'c', ctrl: true, meta: false, shift: false };
  console.log(stringifyKey(key)); // ctrl-c

  key =  { name: 'c', ctrl: true, meta: true, shift: true };
  console.log(stringifyKey(key)); // shift-meta-ctrl-c


Although the algorithm works for all keys, the readline module doesn't work consistent in all terminals. For example, on a Mac Lion xTerm the meta key is never registered.


As just stated the meta key is not registered (at least in xTerm), however if present, stringify-key will take it into account.


The ctrl key seems to work properly in readline, except for the following:

  • ctrl-i interpreted as tab
  • ctrl-h interpreted as backspace
  • ctrl-j and ctrl-m, both interpreted as enter
  • ctrl-[;',/] are also not interpreted correctly


The shift-letter is correctly registered as well, however pressing ctrl-shift and a letter together registers ctrl only. Here is the most likely cause for the latter, since letters are never uppercased when ctrl is pressed.


There is no code inside the readline module that registers pressing the alt key.
Pressing alt in conjunction with a letter is used to enter characters otherwise not available on the keyboard, i.e. alt-p prints π.

However if an alt : true is part of the passed key object, it is considered by stringify-key.


I'm not sure if the unexplained problems above are caused by an incorrect implemention in readline or the underlying terminal. I suggest to investigate the readline source in order to get more information and/or fix problems.

In conclusion, the moral is to expect unexpected results (npi) when using stringify-key for keys emitted by readline.