缘起
正在写一个基于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,从而不影响正在输入的指令。