NodeJS中的Readline正在绘制不需要的行

我有以下问题,在terminal窗口中绘制一个ASCII字符,并将光标移动到另一个位置并使用以下代码重复该过程。

const readline = require('readline'); // // Set the direction of the cursor // let dirrection_y = true; let dirrection_x = true; // // Set the initial position of the cursor // let position_x = 0; let position_y = 0; // // Get the terminal window size // let window_x = process.stdout.columns; let window_y = process.stdout.rows; // // Set the cursor to the top left corner of the terminal window so we can clear // the terminal screen // readline.cursorTo(process.stdout, position_x, position_y) // // Clear everything on the screen so we have a clean template to draw on. // readline.clearScreenDown(process.stdout) // // Create the interface so we can use it to for example write on the console. // let rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); // // React to CTR+C so we can close the app, and potentially do something before // closing the app. // rl.on('close', function() { process.exit(0); }); // // Start the main loop // draw(); // // The main loop that moves the cursor around the screen. // function draw() { setTimeout(function() { // // 1. Move the cursor up or down // dirrection_y ? position_y++ : position_y-- // // 2. When we reach the bottom of the terminal window, we switch // direction from down, to up. // if(position_y == window_y) { // // 1. Switch the direction to go up // dirrection_y = false // // 2. Move the next column or previous one depending on the // direction. // dirrection_x ? position_x++ : position_x-- } // // 3. When we reach the top of the terminal screen, switch direction // again // if(position_y < 0) { // // 1. Switch the direction to go down // dirrection_y = true // // 2. Move the next column or previous one depending on the // direction. // dirrection_x ? position_x++ : position_x-- } // // 4. When we reach the far right of the terminal screen we switch // direction from 'to right', to 'to left' // if(position_x == window_x) { dirrection_x = false } // // 5. When we reach the far left (beginning) of the terminal window // we switch direction again. // if(position_x == 0) { dirrection_x = true } // // 6. Write on char on the terminal screen. // rl.write('█'); // // 7. Move the cursor to the next position // readline.cursorTo(process.stdout, position_x, position_y) // // 8. Restart the loop. // draw(); }, 100) } 

一切都很顺利,直到我达到了一个点,在屏幕上将显示一个完整的线条,我没有画下面的图像显示

在这里输入图像描述

如果我保持应用程序最终将整个屏幕将填满我画的线。

问题

我不相信我正在画这些线,如果这是真的terminal窗口正在发生什么?

Tech Sec

  • 苹果系统
  • terminal和iTerm有相同的问题
  • NodeJS v6.40

在查看readline的源代码时,我相信他们添加的一个旧的黑客来纠正一些标签行为仍然导致这个当前行的问题。 每当光标位置cols被检测到0(可能是源代码中的另一个bug)时,它会发出一个refreshLine —这会引发一个提示。 文档说:“rl.write()方法将数据写入到readline接口的input中,就好像它是由用户提供的一样”,所以提示会把所有的input都输出给你。

我无法find源代码中的解决方法,但可以修改接口的源代码。 在你的const readline = require('readline');之后添加这段代码const readline = require('readline'); 解决问题。

 readline.Interface.prototype._insertString = function(c) { if (this.cursor < this.line.length) { var beg = this.line.slice(0, this.cursor); var end = this.line.slice(this.cursor, this.line.length); this.line = beg + c + end; this.cursor += c.length; this._refreshLine(); } else { this.line += c; this.cursor += c.length; this.output.write(c); this._moveCursor(0); } };