如何不覆盖以前的终端内容
Posted
技术标签:
【中文标题】如何不覆盖以前的终端内容【英文标题】:How to Not Overwrite Previous Terminal Contents 【发布时间】:2015-10-16 05:06:01 【问题描述】:我不确定这是否是重复的,但我不知道要搜索什么,因为我不知道这种现象的名称。
基本上,每当我在某些计算机上使用vim
和less
时,以前的终端内容都会被当前文件的缓冲区覆盖(我认为)。如果我使用滚动条而不是当前程序的命令向后滚动,我可以看到以前的终端内容,但是前面的一些行已被当前程序覆盖。似乎有多少行通过缓冲区(我认为),例如vim
,是终端的先前行被覆盖了多少。当我退出 vim
/less
时,这些行仍然被覆盖,尽管它们出现在历史记录中,当我按下 up
以“返回”历史记录时。
但是,在其他计算机上,会发生完全不同的情况。当我使用vim
或less
时,如果我上下滚动,我看不到终端的前几行。事实上,在大多数出现这种现象的计算机上,如果我用鼠标向后滚动,vim
和less
会向后滚动当前缓冲区中的文件,就好像我按下了Ctrl-E
/Ctrl-Y
。当我退出vim
/less
时,我根本看不到文件,我只看到终端以前的内容,就像我在打开文件之前所做的那样。
每当我使用more
时,无论我用什么电脑,都会出现前一种现象,但我并没有那么频繁地使用more
,因为我喜欢less
在各个方面都更好,所以我没有测试了它的极限。
我遇到前一种现象的计算机/虚拟终端似乎是较旧的计算机和/或功能和规格较低的计算机,这是有道理的,因为大多数人可能想要后者,但它可能更难完成并且需要更多的处理能力和内存。
具有前一种经验的计算机是:我工作时使用的两台旧的RedHat
,可能来自 2000 年代末/2010 年初,我从带有 Penguinet
的 Windows 7
计算机访问; android
带有终端 Rex IDE 的手机/平板电脑,我在其中“安装系统”。在大多数Android
终端应用程序上,我无法获得vim
、less
甚至vi
,尽管我获得了more
。当我将vagrant
与Git Bash
一起使用时,默认TERM
值为msys
,终端都搞砸了,我经历了大部分相同的行为,但更糟。当我将TERM
更改为cygwin
或xterm
时,效果会更好。
(对我来说)具有更理想行为的计算机是:我最新的带有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
。
我对为什么会发生这些行为感兴趣,但我更对将其更改为更理想行为的方法感兴趣。 有没有办法让 vim
和 less
在较旧/功能较弱的计算机上的行为更像是在较新的计算机上的行为? 另外,有没有办法让 Git Bash
滚动通过文件而不是空白终端返回?
奖励:有没有办法让more
在较新的计算机上表现得更像less
?或者这只是more
和less
之间的区别?想一想,有没有可能是能力较差的电脑上的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.html。vim
和 less
解决方案对我有用,尽管您需要分别在打开文件和启动 shell 之前添加它们,这似乎是一个拖累。但是,如果您像我一样一直想要这两种行为之一,那应该没问题。我不知道去哪里实施 X,以及是否值得。以上是关于如何不覆盖以前的终端内容的主要内容,如果未能解决你的问题,请参考以下文章