use emitKeys() from node v0.12.2. see #91 #92 slap-editor/slap#74 slap-editor/slap#96.
This commit is contained in:
parent
85be64273f
commit
4ca28d0860
59
lib/keys.js
59
lib/keys.js
|
@ -40,7 +40,7 @@ function emitKeypressEvents(stream) {
|
|||
function onData(b) {
|
||||
if (EventEmitter.listenerCount(stream, 'keypress') > 0) {
|
||||
var r = stream._keypressDecoder.write(b);
|
||||
if (r) emitKey(stream, r);
|
||||
if (r) emitKeys(stream, r);
|
||||
} else {
|
||||
// Nobody's watching anyway
|
||||
stream.removeListener('data', onData);
|
||||
|
@ -94,20 +94,17 @@ exports.emitKeypressEvents = emitKeypressEvents;
|
|||
// Regexes used for ansi escape code splitting
|
||||
var metaKeyCodeReAnywhere = /(?:\x1b)([a-zA-Z0-9])/;
|
||||
var metaKeyCodeRe = new RegExp('^' + metaKeyCodeReAnywhere.source + '$');
|
||||
var functionKeyCodeReAnywhere =
|
||||
/(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/;
|
||||
var functionKeyCodeReAnywhere = new RegExp('(?:\x1b+)(O|N|\\[|\\[\\[)(?:' + [
|
||||
'(\\d+)(?:;(\\d+))?([~^$])',
|
||||
'(?:M([@ #!a`])(.)(.))', // mouse
|
||||
'(?:1;)?(\\d+)?([a-zA-Z])'
|
||||
].join('|') + ')');
|
||||
var functionKeyCodeRe = new RegExp('^' + functionKeyCodeReAnywhere.source);
|
||||
var escapeCodeReAnywhere = new RegExp([
|
||||
functionKeyCodeReAnywhere.source, metaKeyCodeReAnywhere.source, /\x1b./.source
|
||||
].join('|'));
|
||||
|
||||
function emitKey(stream, s) {
|
||||
var ch,
|
||||
key = {
|
||||
name: undefined,
|
||||
ctrl: false,
|
||||
meta: false,
|
||||
shift: false
|
||||
},
|
||||
parts;
|
||||
|
||||
function emitKeys(stream, s) {
|
||||
if (Buffer.isBuffer(s)) {
|
||||
if (s[0] > 127 && s[1] === undefined) {
|
||||
s[0] -= 128;
|
||||
|
@ -117,11 +114,27 @@ function emitKey(stream, s) {
|
|||
}
|
||||
}
|
||||
|
||||
if (isMouse(s)) {
|
||||
return;
|
||||
}
|
||||
if (isMouse(s)) return;
|
||||
|
||||
key.sequence = s;
|
||||
var buffer = [];
|
||||
var match;
|
||||
while (match = escapeCodeReAnywhere.exec(s)) {
|
||||
buffer = buffer.concat(s.slice(0, match.index).split(''));
|
||||
buffer.push(match[0]);
|
||||
s = s.slice(match.index + match[0].length);
|
||||
}
|
||||
buffer = buffer.concat(s.split(''));
|
||||
|
||||
buffer.forEach(function(s) {
|
||||
var ch,
|
||||
key = {
|
||||
sequence: s,
|
||||
name: undefined,
|
||||
ctrl: false,
|
||||
meta: false,
|
||||
shift: false
|
||||
},
|
||||
parts;
|
||||
|
||||
if (s === '\r') {
|
||||
// carriage return
|
||||
|
@ -178,8 +191,8 @@ function emitKey(stream, s) {
|
|||
// reassemble the key code leaving out leading \x1b's,
|
||||
// the modifier key bitflag and any meaningless "1;" sequence
|
||||
var code = (parts[1] || '') + (parts[2] || '') +
|
||||
(parts[4] || '') + (parts[6] || ''),
|
||||
modifier = (parts[3] || parts[5] || 1) - 1;
|
||||
(parts[4] || '') + (parts[9] || ''),
|
||||
modifier = (parts[3] || parts[8] || 1) - 1;
|
||||
|
||||
// Parse the key modifier
|
||||
key.ctrl = !!(modifier & 4);
|
||||
|
@ -284,13 +297,6 @@ function emitKey(stream, s) {
|
|||
default: key.name = 'undefined'; break;
|
||||
|
||||
}
|
||||
} else if (s.length > 1 && s[0] !== '\x1b') {
|
||||
// Got a longer-than-one string of characters.
|
||||
// Probably a paste, since it wasn't a control sequence.
|
||||
Array.prototype.forEach.call(s, function(c) {
|
||||
emitKey(stream, c);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't emit a key if no name was found
|
||||
|
@ -313,6 +319,7 @@ function emitKey(stream, s) {
|
|||
// stream.emit('keypress', ch, nkey);
|
||||
// }
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function isMouse(s) {
|
||||
|
|
Loading…
Reference in New Issue