Node.js中process.stdin.setRawMode(true)下如何实现退格键功能
Node.js Raw模式下单字符退格实现方案
开启process.stdin.setRawMode(true)后终端默认的行编辑、退格等功能会被禁用,不需要来回切换RawMode,直接通过控制字符实现退格效果即可,具体实现逻辑如下:
- 首先在程序内维护输入内容缓存,用于记录用户当前已输入的所有有效字符
- 监听stdin输入事件,判断输入字符是否为退格键:退格键对应的字符编码为十进制
127 - 识别到退格指令且当前输入缓存不为空时,向stdout输出
\b \b序列即可实现单字符退格:- 第一个
\b将光标左移一位 - 空格覆盖光标当前位置的原有字符
- 第二个
\b将光标再次左移一位,回到退格后的正确输入位置
- 第一个
完整可运行示例代码:
// 开启Raw模式 process.stdin.setRawMode(true) process.stdin.setEncoding('utf8') // 存储用户当前输入的内容 let userInput = '' process.stdin.on('data', (chunk) => { const inputCode = chunk[0] // 处理退格键 if (inputCode === 127) { if (userInput.length > 0) { // 输出退格控制序列 process.stdout.write('\b \b') // 更新输入缓存 userInput = userInput.slice(0, -1) } return } // 处理Ctrl+C退出逻辑,避免程序无法正常关闭 if (inputCode === 3) { process.exit(0) } // 普通字符正常回显并写入缓存 userInput += chunk.toString() process.stdout.write(chunk) })
来回切换RawMode失效的原因:Raw模式关闭前的输入内容已经进入程序的自定义处理流程,不会被终端的默认行编辑逻辑捕获,因此只有切换后新增的输入能触发默认退格,全程自主控制输入输出是最稳定的实现方案。
内容的提问来源于stack exchange,提问作者coodjs
相关产品推荐
相关产品推荐

