返回终端光标开始

我正在编写一个过滤器(在发往终端输出的管道中),有时需要“覆盖”刚发生的一行。 它的工作原理是将stdin传递给标准的字符,直到达到n ,然后调用特殊行为。 我的问题是如何回到行的开头。

我首先想到的是使用r或ANSI序列33[1G 。 但是,如果线条足够长以包裹在终端上(并因此导致其滚动),则这些将仅将光标移回当前物理线。

我的第二个想法是跟踪行的长度(从前n传递的字符n ),然后多次echo b 。 但是,如果该行包含控制字符或转义序列(可能还有Unicode?),则会出错。

通过搜索所有特殊序列并使用它来调整我的角色数量,是否有简单的方法来实现这一点?


即使有一个“魔术序列”,当写入控制台时可以可靠地擦除最后写入的行,您仍然可以在输出中获取行和序列(虽然隐藏在控制台上)。 想想如果有人将输出写入文件或将其传递到其他过滤器会发生什么? 他们会知道如何处理这种输入吗? 不要告诉我你排除了直接写入控制台的可能性。 迟早,有人会想要重定向输出 - 甚至可能是你!

这样做的正确方法是在处理内存时将每行缓存,然后决定是否输出它。 这真的没有办法。


您可以使用简单的ioctl查询终端尺寸:

#include <sys/types.h>
#include <sys/ioctl.h>

// ...

struct winsize ws;
ioctl(1, TIOCGWINSZ, &ws);

// ws.ws_col, ws.ws_row should now contain terminal dimensions

通过这种方式,您可以防止打印超出行尾的任何内容,并简单地使用r方法。


$ cat >test.sh <<'EOF'
> #!/bin/sh
> tput sc
> echo 'Here is a really long multi-line string: .............................................................................................'
> tput rc
> echo 'I went back and overwrote some stuff!!!!'
> echo
> EOF
$ sh test.sh
I went back and overwrote some stuff!!!! .......................................
......................................................

terminfo数据库中查找save_cursorrestore_cursor字符串功能。

链接地址: http://www.djcxy.com/p/42799.html

上一篇: Returning the terminal cursor to start

下一篇: At what stage do you add logging & tracing in OO?