如何在node.js输出流中保持正常输入

缘起

正在写一个基于node.js的minecraft挂机/指令bot,项目地址: Github - Nyaasu66/Mine_bot
使用了console.log实现输出聊天记录,node的REPL模块实现输入指令。
但是发现在其他玩家发言后,> 会消失影响输入,需要输入一个字符再按一下 <- Backspace 退格键> 才会重新出现进行继续输入。即:有输出时,Buffered Command(缓存未发送的指令)会被打断

为了解决这个问题,翻阅文档后先使用了 r.displayPrompt() ,放在bot console指令的输出后和输出前,有消息时立即开始一行新的输入,未发送的文字保留在输入框中。

中文文档:replServer.displayPrompt() 方法会让 REPL 实例做好用户输入的准备,打印配置的 prompt 到 output 中新的一行,然后返回 input 等待新的输入。

但是发现此方法,在每当有玩家发言时,会把光标移动至行首,效果还是不令人满意。

翻阅文档和谷歌后也并未发现nodejs有检测是否存在 Buffered Command的api,
思索一下午后突然发现了'\r'这个妙计。

实现

直接放源码

// 输入模块
const r = repl.start({ prompt: '> ', preview: false});

// 控制台输出模块
bot.on('message', (message) => {
  r.displayPrompt(true)
  console.log('\r'+message.toAnsi()) // 不打扰输入的灵魂:'\r'
  r.displayPrompt(true)
})

'\r'是js字符串中的 特殊字符-回车,从而使每次有新console时,光标移至行首的效果(相当于CR),不会发生换行影响显示效果(因为console的消息已经包含换行了)。

replServer.displayPrompt([preserveCursor])
当 preserveCursor 为 true 时,游标位置不会被复位到 0,从而不影响正在输入的指令。

最后修改:2021 年 02 月 05 日 10 : 13 AM
如果觉得我的文章对你有用,请随意赞赏

发表评论