vi在退出后如何恢复terminal内容?

一个像vi或者man或者其他程序这样的程序如何用程序自己的内容replaceterminal内容,然后在退出那些程序之后把旧的terminal内容带回去?

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 h
   te:<Esc> [?  1 0 4 9 l

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

通过发送控制序列到终端(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"); } 

切换到备用缓冲区和返回(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"); }