2016-12-24 11 views
9

次の問題があります。ここでは、ターミナルウィンドウにASCII文字を描画し、カーソルを別の位置に移動して、次のコードで処理を繰り返します。NodeJSのReadlineが不要な線を描画しています

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) 
} 

私は画像怒鳴るとして描画していなかった画面に示すフルラインが存在することになるポイントに達するまで、すべてがうまくいくには、

enter image description here

た場合を示しています私は最終的に画面全体が私が描いているものをカバーするラインでいっぱいになるアプリを維持しています。

質問

これが本当であるならば、私は、ターミナルウィンドウで何が起こっているのか、私はそれらの線を描いてるとは思いませんか?

テック秒

  • MacOSの
  • ターミナルとITERMはreadlineのためのソースコードを見ると、同じ問題に
  • NodeJS v6.40

答えて

1

を持って、私は彼らがに追加an old hack信じますいくつかのタブの動作を修正すると、まだthis current lineの問題が発生しています。カーソル位置のcolが0(おそらくソースの別のバグ)で検出されると、常にrefreshLine ---を発行してプロンプトをスローします。 docsは、 "rl.write()メソッドは、ユーザーが入力したかのようにreadline Interfaceの入力にデータを書き出します。"というように、プロンプトはすべての入力をあなたに返します。

インソースの回避策が見つかりませんでしたが、インターフェイスのソースコードを変更できます。 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); 
    } 
}; 
+0

素晴らしい、あなたの説明はポイントであり、コードはちょうど働いた!ありがとうございました:) –

+0

好奇心を引き寄せて、この問題をプルリクエストで修正し、 '_insertString'をあなたがここで書いたものに置き換えてみませんか? –

+1

@DavidGattiええ、良いアイデア - 私はそれに取り組んでいます - 私はちょうどタブ修正のケースとあなたのケースの両方に価値があるようにする必要があります。 –

関連する問題