如何不覆盖以前的终端内容

Posted

技术标签:

【中文标题】如何不覆盖以前的终端内容【英文标题】:How to Not Overwrite Previous Terminal Contents 【发布时间】:2015-10-16 05:06:01 【问题描述】:

我不确定这是否是重复的,但我不知道要搜索什么,因为我不知道这种现象的名称。

基本上,每当我在某些计算机上使用vimless 时,以前的终端内容都会被当前文件的缓冲区覆盖(我认为)。如果我使用滚动条而不是当前程序的命令向后滚动,我可以看到以前的终端内容,但是前面的一些行已被当前程序覆盖。似乎有多少行通过缓冲区(我认为),例如vim,是终端的先前行被覆盖了多少。当我退出 vim/less 时,这些行仍然被覆盖,尽管它们出现在历史记录中,当我按下 up 以“返回”历史记录时。

但是,在其他计算机上,会发生完全不同的情况。当我使用vimless 时,如果我上下滚动,我看不到终端的前几行。事实上,在大多数出现这种现象的计算机上,如果我用鼠标向后滚动,vimless 会向后滚动当前缓冲区中的文件,就好像我按下了Ctrl-E/Ctrl-Y。当我退出vim/less时,我根本看不到文件,我只看到终端以前的内容,就像我在打开文件之前所做的那样。

每当我使用more时,无论我用什么电脑,都会出现前一种现象,但我并没有那么频繁地使用more,因为我喜欢less在各个方面都更好,所以我没有测试了它的极限。

我遇到前一种现象的计算机/虚拟终端似乎是较旧的计算机和/或功能和规格较低的计算机,这是有道理的,因为大多数人可能想要后者,但它可能更难完成并且需要更多的处理能力和内存。

具有前一种经验的计算机是:我工作时使用的两台旧的RedHat,可能来自 2000 年代末/2010 年初,我从带有 PenguinetWindows 7 计算机访问; android 带有终端 Rex IDE 的手机/平板电脑,我在其中“安装系统”。在大多数Android 终端应用程序上,我无法获得vimless 甚至vi,尽管我获得了more。当我将vagrantGit Bash 一起使用时,默认TERM 值为msys,终端都搞砸了,我经历了大部分相同的行为,但更糟。当我将TERM 更改为cygwinxterm 时,效果会更好。

(对我来说)具有更理想行为的计算机是:我最新的带有Ubuntu 15.04 的笔记本电脑(是的,预装了Linux 的计算机);过去几年我在 Windows 8 笔记本电脑上安装的任何 Linux VM,但我只获得了最新版本,所以我不知道这种行为有多老; Git Bash 在我的 Windows 8 笔记本电脑上。当我用鼠标滚动时,Git Bash 没有向后滚动文件,而是通过一个空终端,但这可能是因为我的 vimrc/les-s-rc 中的设置。当我退出 Git Bash 时,它仍然显示所有之前的行而不是文件。

这些计算机中的大多数都在使用bash,但是当我在我最新的ubuntu 计算机上安装和使用fish 时,我仍然遇到了新的现象,即使我将它设置为默认shell,我也没有相信Git Bash 在技术上是bash,尽管它可能是。我相信Terminal Rex 应用程序在安装到系统时使用了bash,但是当我使用其他终端应用程序检查SHELL 环境变量并且没有安装系统的Terminal Rex 时,它报告为sh

我对为什么会发生这些行为感兴趣,但我对将其更改为更理想行为的方法感兴趣。 有没有办法让 vimless 在较旧/功能较弱的计算机上的行为更像是在较新的计算机上的行为? 另外,有没有办法让 Git Bash 滚动通过文件而不是空白终端返回?

奖励:有没有办法让more 在较新的计算机上表现得更像less?或者这只是moreless 之间的区别?想一想,有没有可能是能力较差的电脑上的less实际上是more

【问题讨论】:

【参考方案1】:

所描述的行为是 xterm 样式的备用屏幕。有两种情况:

当它使用时,当你运行vim等全屏程序时,终端会切换到alternate屏幕。 当使用时,终端在运行全屏程序时继续正常屏幕。

正常/备用屏幕大小相同:终端的可见部分忽略回滚区域。您可以使用鼠标查看回滚。如果您在切换到备用屏幕时这样做,您可以看到与当前(备用)屏幕相邻的回滚。切换回来后,例如,当 vim 退出时,前几行将显示在整个回滚和当前(正常)屏幕中。两者之间没有标记。

What mechanism allows ViM to temporarily overwrite the entire console?

最近讨论了正常/备用屏幕的某些方面

Unix(以及 Linux 和 BSD 等)上的大多数应用程序都关注 TERM 环境变量,它们(或诸如 ncurses 之类的库)使用它从 terminal database 检索信息。原则上,可以为不同的应用程序分别设置TERM 以引发不同的行为(需要注意的是,一些应用程序(例如 vim)具有内置表来“修复”终端数据库,它们可能会在没有警告的情况下应用)。例如,在 POSIX shell(或类似 bash)中运行,您可以键入以下内容以运行 vim 和 less,并使用两个不同的终端描述:

TERM=vt100 vim foo.c
TERM=xterm less foo.c

【讨论】:

我无法弄清楚如何在您的链接中实施解决方案。我找到了一个更容易理解和实施的资源,尽管如果没有你的帮助我可能不会找到它:shallowsky.com/linux/noaltscreen.htmlvimless 解决方案对我有用,尽管您需要分别在打开文件和启动 shell 之前添加它们,这似乎是一个拖累。但是,如果您像我一样一直想要这两种行为之一,那应该没问题。我不知道去哪里实施 X,以及是否值得。

以上是关于如何不覆盖以前的终端内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OS X 的终端中清除以前的输出?

Java 程序 关于Properties 类使用Store方法时不能会覆盖以前Properties 文件的内容

python 3.x覆盖以前的终端行

C++ 链表覆盖以前的数据

如何在 C 中覆盖标准输出

如何在不覆盖当前内容的情况下写入文件? [复制]