退出后vi如何恢复终端内容?

时间:2013-02-23 18:52:59

标签: linux unix

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

2 个答案:

答案 0 :(得分:10)

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

ANSI Escape Sequence ESC (\ 033八进制) [开头。 ; 分隔数字。

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");
}

答案 1 :(得分:8)

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

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

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

xterm-color
  ti: <Esc> 7 <Esc> [ ? 47 h
  te: <Esc> [ 2 J <Esc> [ ? 4 7 l <Esc> 8

xterm-256color
  ti: <Esc> [ ? 1 0 4 9 h
  te: <Esc> [ ? 1 0 4 9 l

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