终端或控制台中的就地进度输出

dan*_*dan 32 ruby unix terminal ncurses

当您运行时git clone,它会更新进度.例如,收到的对象的百分比会发生变化.

user@athena:~/cloj/src$ git clone git://git.boinkor.net/slime.git
Initialized empty Git repository in /home/user/cloj/src/slime/.git/
remote: Counting objects: 15936, done.
remote: Compressing objects: 100% (5500/5500), done.
Receiving objects:  28% (4547/15936), 3.16 MiB | 165 KiB/s
Run Code Online (Sandbox Code Playgroud)

这是如何完成的?它是否使用ncurses或更简单的东西,比如退格字符和常规字符输出的某种组合?

我对如何通过Ruby实现这种控制台输出特别感兴趣.

编辑

我原来的问题得到了回答.但这是一个附录.例如,当您使用MPlayer时,它不仅会更新一行以显示当前进度,还会更新一行(例如,当您按下暂停时).

 =====  PAUSE  =====
A:  79.9 (01:19.9) of 4718.0 ( 1:18:38.0)  0.3% 
Run Code Online (Sandbox Code Playgroud)

您如何在适当的位置更新两行输出?

小智 38

使用回车.'\ r'通常应该有效.

  • 这是一个例子:`10.times {| i | STDOUT.write"\ r#{i}"; 睡觉1}` (11认同)

eph*_*ent 7

混帐/ progress.c

...
        eol = done ? done : "   \r";
...
                fprintf(stderr, "...%s", ..., eol);
                fflush(stderr);
Run Code Online (Sandbox Code Playgroud)

Git只是发出一个回车而没有换行,终端将其解释为"移动到第一列".