Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux vi在退出终端内容后如何恢复终端内容?_Linux_Unix - Fatal编程技术网

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

Linux vi在退出终端内容后如何恢复终端内容?,linux,unix,Linux,Unix,像vi或man或任何其他程序这样的程序如何用程序自己的内容替换终端内容,然后退出这些程序后,它们会带回旧的终端内容?vi切换到终端支持的备用屏幕缓冲区。这是使用转义序列实现的。有关详细信息,请参阅 这些设备的termcap输入为“ti”输入,以及“te”退出全屏模式 正如@Celada在下面指出的,硬编码xterm转义序列不是一个好主意™, 因为序列根据$TERM而变化,例如: xterm-color ti: <Esc> 7 <Esc> [ ? 47 h te:

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

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颜色 ti:7[?47小时 te:[2 J[?4 7 l 8 xterm-256color ti:[?10 4 9小时 te:[?10 4 9升
另一方面,如今在非xterm终端中,xterm的支持非常广泛。仅支持xterm不太可能导致问题,除非用户具有异国情调或过时的$TERM设置。来源:我支持这样做的产品。

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

A以ESC(\033八进制)[开头。 ;分隔数字

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

#include <stdio.h>

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

}
#包括
int main()
{
//清除终端
printf(“\033[2J\033[1;1H”);
printf(“你好”);
}
切换到备用缓冲区并返回(xterm)的示例

#包括
#包括
int main()
{
printf(“\033[?1049h\033[H”);
printf(“hello\n”);
睡眠(1);
printf(“再见”);
睡眠(1);
printf(“\033[?1049l”);
}

通过向终端(xterm、vt-220)或ncurses(如mc)发送控制序列,请看这个问题:我读了这个问题,但我仍然无法确定可以发送到终端的控制序列。我使用的是Solaris 11.0。谢谢,但如何在我的C程序中切换到备用缓冲区?@PaulBeckingham您知道这样做的功能名称吗(我不知道)。如果您这样做,我建议将其添加到您的答案中,因为这是软件应该使用的,而不是特定类型终端的硬编码转义序列,以便与任何类型的终端兼容(由
$TERM
设置)@PaulBeckingham噢,事实上,在你发布的链接中就有:smcup和rmcup。我仍然不明白如何将所有这些放在C程序中?我只能使用?1049h转义字符,但我不知道如何使用ti或te。试试“man termcap”。你会看到一个获取“ti”和“te”的API值。然后您只需在stdout上发出它们。@pce向您展示了如何硬编码。您应该使用termcap和printf。我不知道,但它可以工作。它显示一个带有输出的备用屏幕,然后在完成执行后切换回正常屏幕。为什么是1049?因为xterm支持数百种不同的转义序列,例如颜色、滚动rectaNGLE、清除屏幕、光标移动等。@PaulBeckingham谢谢,我用/Ansi Escape/Sequence()替换了/Control/,请不要使用八进制数,用
\e
\x1b
代替
\033
。关于1049,最初有47个有问题,我添加了1047/1048(为了使它们不同),最后是1049。当然,它在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");
}