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

ASe*_*lim 10 unix linux

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

pce*_*pce 10

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

ANSI转义序列开头ESC(\ 033八进制)[. ;分开数字.

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

#include <stdio.h>

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

}
Run Code Online (Sandbox Code Playgroud)

切换到备用缓冲区并返回(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");
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*ham 8

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

这些的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设置的用户.资料来源:我支持这样做的产品.

  • @PaulBeckingham 你知道执行此操作的 [terminfo](http://en.wikipedia.org/wiki/Terminfo) 功能名称吗(我不知道)。如果您这样做,我建议将其添加到您的答案中,因为这就是软件应该使用的内容,而不是特定类型终端的硬编码转义序列,以便与任何类型的终端兼容(由“$TERM”设置) 。 (2认同)