Fix meta+character keys on mac
authorBert Belder <bertbelder@gmail.com>
Thu, 20 Jan 2011 23:47:55 +0000 (00:47 +0100)
committerRyan Dahl <ry@tinyclouds.org>
Fri, 21 Jan 2011 21:51:19 +0000 (13:51 -0800)
lib/tty_posix.js

index dd37e31..8ffe9b3 100644 (file)
@@ -66,6 +66,7 @@ ReadStream.prototype.isTTY = true;
   Some patterns seen in terminal key escape codes, derived from combos seen\r
   at http://www.midnight-commander.org/browser/lib/tty/key.c\r
 \r
+  ESC letter\r
   ESC [ letter\r
   ESC [ modifier letter\r
   ESC [ 1 ; modifier letter\r
@@ -89,9 +90,10 @@ ReadStream.prototype.isTTY = true;
   - two leading ESCs apparently mean the same as one leading ESC\r
 */\r
 \r
-// Regex used for ansi escape code splitting\r
-var splitKeyCodeRe =\r
-  /^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;(\d+))?([a-zA-Z]))/;\r
+// Regexes used for ansi escape code splitting\r
+var metaKeyCodeRe = /^(?:\x1b)([a-zA-Z0-9])$/,\r
+    functionKeyCodeRe =\r
+      /^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;(\d+))?([a-zA-Z]))/;\r
 \r
 ReadStream.prototype._emitKey = function(s) {\r
   var char,\r
@@ -140,7 +142,13 @@ ReadStream.prototype._emitKey = function(s) {
     key.name = s.toLowerCase();\r
     key.shift = true;\r
 \r
-  } else if (parts = splitKeyCodeRe.exec(s)) {\r
+  } else if (parts = metaKeyCodeRe.exec(s)) {\r
+    // meta+character key\r
+    key.name = parts[1].toLowerCase();\r
+    key.meta = true;\r
+    key.shift = /^[A-Z]$/.test(parts[1]);\r
+\r
+  } else if (parts = functionKeyCodeRe.exec(s)) {\r
     // ansi escape sequence\r
 \r
     // reassemble the key code leaving out leading \x1b's,\r