man、screen、vim等程序如何创建临时覆盖?

问题描述 投票:0回答:1

一些*NIX命令,如 screen, man, vim 和其他程序,在shell环境中创建一个临时的canvasscreenoverlay。当这类程序执行时,它们会覆盖或隐藏之前在终端中显示的任何内容--几乎就像终端窗口中的 "全屏 "模式。然而,当它们终止时,它们会显示或恢复之前在终端上的任何内容。

在下面的例子中,我在屏幕上创建了一些填充文本,然后调用了 man bash. 打开man页面,覆盖了终端显示屏上所有其他字符。当我关闭man页面时,被遮盖的字符又显示出来了。

terminal screen capture before running <code>man bash</code>

当一个例子的全屏程序正在运行时

Screencap of the man page for Bash

之后

Screencap of the terminal after running <code>man bash</code>

我希望写到stdoutstderr的程序可以完成第一步(用程序特有的内容替换终端的内容),但这样就会产生一大堆我可以滚动浏览的文本,因此无法进行第二步。因此无法进行第二步: 终端的内容。这意味着,要么是程序记住了以前的屏幕内容并重新输出(我怀疑?

我的问题

我怎样才能在自己的程序或脚本中实现这种行为?

也许我应该使用cursesncurses、tput、termcapterminfo或ANSI转义序列?

更新。

这个修改后的问题和 https:/unix.stackexchange.comquestions27941show-output-on-another-screen-and-return-to-normal-when-done。. (我在写这个问题的时候,虽然找了很多地方,但还是没有找到)。不同的是,我的问题比较笼统(任何语言),而那个问题是针对Bash的。两个问题的答案基本上是一样的。如果和其他网站上的问题太过相似, 可以在这里关闭它, 以备不时之需. 的原因。

shell terminal curses terminfo tput
1个回答
4
投票

这些程序是如何实现这种行为的?

ANSI转义序列。试着运行这个脚本。

#/bin/bash -
tput smcup
echo 'Hello world!'
sleep 3
tput rmcup

使用 infocmp你可以看到产生这种叠加效果的底层序列,如

$ infocmp -1 | grep 'rmcup\|smcup'
        rmcup=\E[?1049l\E[23;0;0t,
        smcup=\E[?1049h\E[22;0;0t,

这种行为是依赖于shell还是依赖于系统?

都不是,这取决于终端仿真器是否支持saverestore操作。

© www.soinside.com 2019 - 2024. All rights reserved.