2011-11-22 102 views
2

我正在编写一个简单的命令行工具,以允许命令行输入到node.js服务器。 我想制作一个缓冲区,这样用户可以按下并查看最后一条命令。要做到这一点我已经设置检测keypress事件中的输入node.js rawmode

require('tty').setRawMode(true); 

,并检测所有按键:

process.stdin.on('keypress', function (letter, key) { 
    if (key && key.ctrl && key.name == 'c') { 
     process.exit(); 
    } else if (key && key.enter) { 
     write(letter); 
     msgFired(buffer[bufferPos]); 

     bufferPos += 1; 
     buffer[bufferPos] = ""; 
    } else { 
     write(letter); 
     buffer[bufferPos] += letter; 
    } 
}); 

这不检测进入压力机。

有没有一种方法来检测整个行何时触发(如RawMode为false时)与按键事件一起?如果不是,我如何检测enter-press?

回答

2

据我所看到的,你唯一的错误是这样的:

else if (key && key.enter) { 

应该是这样的:

else if (key && key.name == 'enter') { 
+0

是的,我想通了。由于8小时规则,我无法发布自己的解决方案......无论如何,谢谢! – JPuge

1

我已经找到了自己的解决方案。要检查输入,相应的测试:

if (key && key.name == 'enter') 

这里是工作的相当不错的解决方案:

var allowedKeys = "abcdefghijklmnopqrstuvwxyzæøåABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ1234567890!- "; 
process.stdin.on('keypress', function (letter, key) { 
    if (key && key.ctrl && key.name == 'c') { 
     listen = false; 
     log(""); 
     process.exit(); 
    } else if (key && key.name == 'enter') { 
     write('\n'); 
     msgFired(buffer[bufferPos]); 

     buffer[bufferPos] = ""; 
    } else if (allowedKeys.indexOf(letter) != -1) { 
     write(letter); 
     buffer[bufferPos] += letter; 
    } 
}); 

的键名(key.name)是相当容易猜到。标签是“标签”,进入被“ENTER”键,向上箭头是“向上”等

我希望这是有帮助的人......

编辑:请注意,我说允许的字符列表,所以代码不会像奇怪的字符ctrl + 3崩溃。