光标在终端闪烁去除,如何?(cursor blinking removal in terminal,

2019-06-25 10:16发布

我用我的C ++程序下面的几行输出我的模拟的进度信息,

double N=0;
double percent=0;
double total = 1000000;
for (int i; i<total; ++i)
{
    percent = 100*i/total;
    printf("\r[%6.4f%%]",percent);
}

它工作正常!

但问题是,我看到了终端光标一直通过数字循环闪烁,这是很烦人的,任何人都知道如何摆脱呢?

我见过像wget或Ubuntu容易一些程序,他们所使用的进度条或百分比过,但他们似乎没有闪烁光标的问题,我想知道他们是怎么做到的?

谢谢!

Answer 1:

只是一个猜测:尝试使用“\ B”(退格键)字符,而不是“\ r”适当数量。

== ==编辑

我不是一个Linux shell向导,但是这可能工作:

system("setterm -cursor off");
// ...display percentages...
system("setterm -cursor on");

不要忘了#include <cstdlib><iostream>



Answer 2:

您可以隐藏,并使用显示光标DECTCEM在(DEC文本光标能模式)模式DECSMDECRM

fputs("\e[?25l", stdout); /* hide the cursor */

fputs("\e[?25h", stdout); /* show the cursor */


Answer 3:

以避免闪烁的光标的一个方法是(所建议的),以暂时隐藏光标。

然而,这仅仅是解决方案的一部分。 你的计划也应考虑到这一点:

  • 隐藏光标和修改屏幕,显示在光标后再次其回原来的位置。
  • 隐藏/显示光标只保留从当你的更新只需要小的时间量显着闪烁的光标。 如果你发生了一些耗时的过程混合这一点,你的光标闪烁。

使用建议的溶液setterm不是便携式的; 它是特定于Linux控制台。 并使用运行一个可执行的system是不是真的有必要。 但是,即使运行

system("tput civis");
...
system("tput cnorm");

超过使用改进setterm

检查所述源代码wget没有找到任何光标隐藏转义序列。 什么你与它的进度栏看到的是,它让光标大致每当它的东西费时同一个地方。 输出到终端需要这么短的时间,你不(通过打印回车,然后再编写大部分线路以上)注意线的瞬间改写。 如果它是速度较慢,则隐藏光标将帮助 - 在一定程度上。

顺便说一句-此光标隐藏技术在终端驱动一些编辑器(VIM和用于恶劣 )。



Answer 4:

这些应用程序可能使用ncurses的 。 见mvaddstr



Answer 5:

将光标跳到周围的原因是因为stdout被缓冲,所以你不知道实际上有多少个字符被打印在某个时间点。 究其原因wget没有一个跳跃的光标是,他们实际上是打印到stderr来代替。 尝试以下方法:

fprintf(stderr,"\r[%6.4f%%]",percent);

这也有不搞乱如果要保存使用地方,比如管道的输出其余文件的好处是:

$ ./executable > log.data


Answer 6:

按Insert键...如果不工作,然后按下键盘上的Fn键。 这肯定会工作
希望这可以帮助



文章来源: cursor blinking removal in terminal, how to?