如何在Node.js中监听终端的Command/Ctrl+L按键组合?
监听Command/Ctrl+L按键组合实现自定义清屏
嘿,刚好碰到过类似的需求,咱们直接上解决方案,一步步来实现你要的功能:
首先你猜的没错,确实要用到readline.emitKeypressEvents,不过得配合终端的原始模式才能捕获到组合键——不然系统会直接执行默认的清屏动作,轮不到咱们的代码处理。
完整实现代码
const readline = require('readline'); // 第一步:让终端进入原始模式,绕过系统默认按键处理,直接捕获所有按键 process.stdin.setRawMode(true); // 第二步:启动readline的按键事件监听,把标准输入流转换成可触发keypress事件的流 readline.emitKeypressEvents(process.stdin); // 第三步:监听keypress事件,判断是否是目标组合键 process.stdin.on('keypress', (str, key) => { // 匹配Mac的Command+L 或者 Windows/Linux的Ctrl+L if ((key.meta || key.ctrl) && key.name === 'l') { // 执行你的清屏逻辑 process.stdout.write('\x1Bc'); console.log('屏幕已清空!'); // 可选提示,不需要可以删掉 } // 贴心小功能:按Ctrl+C退出程序,避免终端一直卡在原始模式 if (key.ctrl && key.name === 'c') { // 退出前恢复终端正常模式(可选,但更严谨) process.stdin.setRawMode(false); process.exit(); } }); console.log('就绪!按 Command/Ctrl+L 清屏,按 Ctrl+C 退出');
关键知识点解释
process.stdin.setRawMode(true):这是核心!默认情况下终端会优先处理Command+L这类系统级快捷键,设置原始模式后,所有按键事件都会直接传递给我们的代码,不会被系统拦截。readline.emitKeypressEvents(process.stdin):这个方法会给标准输入流添加keypress事件支持,让我们能监听每一次按键操作。keypress事件的key对象:包含按键的详细信息:key.meta:对应Mac上的Command键key.ctrl:对应Windows/Linux上的Ctrl键key.name:按键的名称(这里是小写的l,注意区分大小写)
注意事项
- 直接用Node.js运行脚本即可,比如
node clear-screen.js - 如果程序异常退出,可能导致终端卡在原始模式,此时可以按
Ctrl+D或重启终端恢复正常
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

