如何更新多行控制台上的数据

时间:2013-07-02 11:44:16

标签: javascript node.js console

我想在控制台的两行显示数据。我只是想每次都更新这两行。

到目前为止我所做的是 -

var _logInline = function(alpha, bravo) {
    process.stdout.cursorTo(0, 0);
    process.stdout.clearLine();
    process.stdout.cursorTo(0);
    process.stdout.write(alpha.toString());
    process.stdout.write('\n');
    process.stdout.clearLine();
    process.stdout.cursorTo(0);
    process.stdout.write(bravo.toString());
    process.stdout.write('\n');

};

var delay = 1000;
var time = 0;
setInterval(function() {
    time++;
    _logInline('alpha-' + time, 'bravo-' + time * time);
}, delay);

此解决方案的明显问题是光标会移到窗口的顶部。我不希望这样,它应该显示当前光标所在的内容。可能我需要在我的逻辑中首先获得当前光标位置。有没有办法做到这一点?

替代方案和最优选的解决方案是获得可以执行相同操作的库

编辑: 我在stackoverflow上看到了一些问题,它提供了一个没有新行的日志记录选项,但这并不是我想要的。我想要多个非新行记录。

2 个答案:

答案 0 :(得分:1)

ncurses是我用来控制终端的最强大的库,mscdex有一个优秀的npm包绑定到c库https://npmjs.org/package/ncurses

但可能对你的需求来说有点矫枉过正,这是一个替代解决方案,但它涉及使用bash脚本:

基于this gist我将以下代码整合到您的示例中, 你可以download it from gist或在这里阅读它,不要忘记给bash脚本赋予exec权限:

  chmod +x cursor-position.sh 

<强>光标position.js

module.exports = function(callback) {
  require('child_process').exec('./cursor-position.sh', function(error, stdout, stderr){
    callback(error, JSON.parse(stdout));
  });
}

<强> cursor-position.sh

#!/bin/bash
# based on a script from http://invisible-island.net/xterm/xterm.faq.html
# http://stackoverflow.com/questions/2575037/how-to-get-the-cursor-position-in-bash
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
# on my system, the following line can be replaced by the line below it
echo -en "\033[6n" > /dev/tty
# tput u7 > /dev/tty    # when TERM=xterm (and relatives)
IFS=';' read -r -d R -a pos
stty $oldstty
# change from one-based to zero based so they work with: tput cup $row $col
row=$((${pos[0]:2} - 1))    # strip off the esc-[
col=$((${pos[1]} - 1))
echo \{\"row\":$row,\"column\":$col\}

<强> index.js

var getCursorPosition = require('./cursor-position');

var _logInline = function(row, msg) {
  if(row >= 0) row --; //litle correction
  process.stdout.cursorTo(0, row);
  process.stdout.clearLine();
  process.stdout.cursorTo(0, row);
  process.stdout.write(msg.toString());
};

var delay = 1000;
var time = 0;

//Start by getting the current position
getCursorPosition(function(error, init) {
  setInterval(function() {
      time++;
      _logInline(init.row, 'alpha-' + time);
      _logInline(init.row + 1, 'bravo-' + time * time);
  }, delay);
});

答案 1 :(得分:0)

我考虑了很长时间……

这是多行的非常幼稚的解决方案:


import {execSync} from "child_process";

var util = require('util');
var x = 0;
var y = 100;
setInterval(function () {
    execSync('tput cuu1 tput el tput cuu1 tput el', {stdio: 'inherit'});
    process.stdout.write(`hello1: ${x++}\nhello2: ${y++}\r`);  // needs return '/r'
    // util.print('hello: ' + x + '\r');  // could use this too
}, 1000);

当我将有一个更强大的实现时,我将进行更新。