Answers:
最初启动TUI程序时,会话的内容已被覆盖。您可以看到情况就是如此。
当使用ncurses
诸如此类的工具来显示其文本用户界面的TUI程序启动时,它将清除屏幕。此时,屏幕上的所有内容均已被覆盖。
您所缺少的,以及您不知道其名称的是带有备用屏幕缓冲区的终端的想法。当这样的TUI程序启动时,它将发出转义序列以切换到终端的备用屏幕缓冲区(如果有)。然后其所有输出进入该缓冲区。当程序退出或自行暂停时,它会发出转义序列以恢复主屏幕缓冲区,而在TUI程序已将其用户界面显示在备用缓冲区上时,该主屏幕缓冲区保持不变。
对于没有备用屏幕缓冲区的终端,没有发布转义序列的要求,并且全屏用户界面会覆盖终端上以前的内容。
程序在terminfo
或termcap
数据库中查找这些转义序列。在terminfo
世界范围内,终端功能被命名为smcup
和rmcup
。在termcap
世界上,它们被命名为ti
和te
。如所记录,它们没有提及屏幕缓冲区。
相反,他们谈论进入和退出“光标寻址模式”。想法是,呈现这样的全屏界面的TUI程序在光标寻址模式下运行,该程序实际上不需要终端进行滚动。而仅输出文本滚动行的TUI程序则不是。因此,一个人可以进入和退出此模式。(在现实世界中,事情并不是那么清晰。例如:诸如Z Shell之类的现代Shell会在光标上移动以进行行编辑,菜单完成和$RPROMPT
;但不要切换到备用屏幕缓冲区,请不要具有完整的全屏用户界面,并可以进行滚动操作。)
因此,这些功能通常所做的不仅仅是切换缓冲区。 如果终端具有这样的转义序列,则smcup
还包含用于保存当前光标位置rmcup
的转义序列,以及用于恢复当前光标位置的转义序列。
您的问题是两件事之一:
termcap
FreeBSD系统上的数据库没有特定终端类型的te
和ti
条目,因为条目不完整。终端类型取自服务器端上的TERM
环境变量。它的值表示数据库中的一个条目。因此,请确保您的环境变量使用与(本地)终端仿真器的功能匹配的功能来命名一个条目。如果没有项目相匹配包含您的终端模拟器和,那么你就必须简单地添加这样的条目。termcap
TERM
/etc/termcap
ti
te
ti
并te
不管他的终端类型是什么:setenv TERMCAP ${TERM}:ti@:te@:tc=${TERM}
ti
/ 的终端上进行操作te
,因此当我切换到具有该功能的终端时,我说的是他所做的完全相同的事情:“我的会话被覆盖”,这意味着我的nano / less / vi /无论什么会话都消失了,并被我之前所做的一切所取代。从屏幕截图中我可以看到他正在谈论相反的情况。
我发现例子的正是改变这种张贴在FreeBSD论坛。进行更改后,查看联机帮助页或编辑文件时屏幕上的内容将被清除,仅在我的终端(bash
)中显示命令等。现在,在编辑器或其他类似过程中,还可以使用多种滚动方法(例如“两指滚动”)。
对我来说,出色的工作FreeBSD 11.0-RELEASE-p9
是运行,将第四行(定义te
&ti
)和反斜杠添加到以下术语中的别名/usr/share/misc/termcap
:
xterm-256color|xterm alias 3:\
:Co#256:pa#32767:\
:AB=\E[48;5;%dm:AF=\E[38;5;%dm:tc=xterm-new:\
:te=\E[2J\E[?47l\E8:ti=\E7\E[?47h::tc=xterm-xfree86:
由于我来自macOS和my TERM=xterm-256color
,因此已xterm-256color|xterm alias
在2884行中将其添加到。您TERM
和您termcap
文件中的位置可能有所不同。
然后,在对termcap进行更改之后,必须使用以下方法重建termcap数据库:
cap_mkdb /usr/share/misc/termcap
(我将其作为对现有答案的评论,但缺乏> 50的声誉。)
ti
和te
,并且他的TERM
环境变量命名了一个/etc/termcap
条目,该条目设置ti
并te
设置了适当的转义码。各种应用程序正在输出这些代码,他不喜欢由此产生的屏幕缓冲区切换。因此,建议应该选择一个省略ti
和删除的条目te
。如果需要自定义条目(或重写现有的),而不是编辑/etc/termcap
,他可以把它~/.termcap
或TERMCAP
环境变量。