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

Dav*_*tti 9 javascript terminal node.js

我有以下问题,我在终端窗口中绘制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)
}
Run Code Online (Sandbox Code Playgroud)

一切顺利,直到我达到一个点,在屏幕上会显示一条完整的线条,我没有绘制,因为图像波纹显示

在此输入图像描述

如果我最终保持应用程序运行,整个屏幕将填满覆盖我正在绘制的内容的线条.

问题

我不相信我正在绘制那些线,如果这是真的终端窗口发生了什么?

技术部门

  • 苹果系统
  • 终端和iTerm有同样的问题
  • NodeJS v6.40

Jac*_*ade 2

在查看 readline 的源代码时,我相信他们添加的用于纠正某些选项卡行为的旧黑客仍然会导致当前行出现问题。每当检测到光标位置 cols 为 0(可能是源代码中的另一个错误)时,它就会发出一个刷新线——它会抛出一个提示。文档说“rl.write() 方法会将数据写入 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);
  }
};
Run Code Online (Sandbox Code Playgroud)