14

vi 或 man 之类的程序或任何其他程序如何用程序自己的内容替换终端内容,然后在退出这些程序后又带回旧的终端内容?

4

2 回答 2

12

Vi 翻转到终端支持的备用屏幕缓冲区。这是使用转义序列实现的。有关完整详细信息,请参阅此链接

这些的 termcap 条目是“ti”进入,“te”退出全屏模式。

正如@Celada 在下面指出的那样,硬编码 xterm 转义序列不是一个好主意™,因为序列根据 $TERM 而有所不同,例如:

xterm-颜色
  ti: <Esc> 7 <Esc> [ ? 47 小时
  te: <Esc> [ 2 J <Esc> [ ? 4 7 l <Esc> 8

xterm-256color
  ti: <Esc> [ ? 1 0 4 9 小时
  te: <Esc> [ ? 1 0 4 9 升

另一方面,现在非 xterm 终端对 xterm 的支持非常广泛。仅支持 xterm 不太可能导致问题,除非用户具有特殊或过时的 $TERM 设置。资料来源:我支持这样做的产品。

于 2013-02-23T18:57:13.847 回答
12

通过将控制序列发送到终端(xterm、vt-220)或使用 ncurses(如 mc)。

ANSI 转义序列ESC(\033 octal)开头[;分隔数字。

C 清除屏幕并将光标移动到 1,1 的示例。

#include <stdio.h>

int main()
{
    // clear the terminal
    printf("\033[2J\033[1;1H");
    printf("hello");

}

切换到备用缓冲区和返回 (xterm) 的示例。

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("\033[?1049h\033[H");
    printf("hello\n");
    sleep(1);
    printf("bye");
    sleep(1);
    printf("\033[?1049l");
}
于 2013-02-23T19:48:43.553 回答