OS X终端线不会回滚


12

我有一个使用Mac OS X的Terminal(TERM = xterm)时出现的问题:有时它会陷入一种状态,即从顶部滚动的行不会添加到回滚缓冲区中。我没有使用screen或类似的东西;这是“终端”选项卡中的纯bash外壳。

打开新标签后,它不会立即执行此操作。我认为这是我在“问题”选项卡中运行的某些操作的副作用。我的猜测是,它与xterm仿真有关,可能与滚动区域有关。

什么不起作用:

  • 通过Shell菜单进行软复位和硬复位
  • reset在标签中运行

是否有可靠的方式重置终端和/或xterm状态?

即使唯一的解决方法是关闭选项卡并打开一个新选项,任何人都可以对发生的情况提供解释吗?


您正在运行哪个Mac OS X版本?您是否在小于“无限制”的东西上设置了缓冲区,而您丢失的行仅仅是掉在缓冲区后端的最旧的行?

Mac OS X 10.6.2,缓冲区为10,000行,但是丢失的行是在屏幕外滚动的行。如果我在一个屏幕上向上翻页,这些行就不存在了,实际上,当行从顶部滚动时,最新的回滚页面永远不会改变。
史蒂夫·麦森

Answers:


19

这意味着终端正在使用备用屏幕缓冲区。有一个主屏幕,它滚动到回滚日志中,而另一个屏幕则没有。默认情况下,诸如top,less,emacs,vim和screen之类的“全屏”或“面向屏幕”程序会将终端切换到备用屏幕。

每个屏幕都有其自己的内容和状态。有了备用屏幕,程序可以接管整个显示,然后在退出时恢复原来的内容,方法是切换回主屏幕。

从Mac OS X Lion 10.7开始,终端提供了一个菜单项,您可以用来手动切换屏幕:

查看>显示/隐藏备用屏幕

主要是为了提供此功能,以便您可以在退出“全屏”程序后从备用屏幕查看或复制文本。Xterm具有类似的命令。

您还可以使用它来手动强制程序使用特定屏幕,例如,控制输出是否进入回滚日志。但是,如果您当前正在使用一个显式切换到备用屏幕的程序,则在程序运行时将其强行切换到主屏幕时,可能会造成混淆或获得意外结果,因此请谨慎使用。

根据程序的不同,它可能具有命令行参数或其他某种方式来配置它以使用主屏幕。例如less -X

一些terminfo条目经过专门设计以禁止使用备用屏幕,例如xterm1TERM=xterm1 emacs将在主屏幕上运行Emacs。我不建议xterm1永久使用,因为与xterm-256colorLion 的默认功能相比,它会禁用许多其他有用的功能。

您还可以使用tput命令切换屏幕,以从shell或脚本内部发出转义序列。tput smcup切换到备用屏幕,然后tput rmcup切换回主屏幕。

要查看当前正在运行的程序,请查看“终端”窗口或选项卡标题中显示的程序名称,或查看“检查器”窗口(Shell> Show Inspector)。检查器列表中的最后一个过程(通常)是使用屏幕的当前程序。那就是您需要配置以使用主屏幕的那个。


1
这听起来是一个很有希望的答案。是否有合理的解释说明程序可能会异常退出,从而使备用屏幕保持活动状态?
史蒂夫·马德森

如果您运行完“全屏”程序后又回到了外壳中,是的,这是有可能的,尽管大多数流行的程序(如我列出的程序)在清除它们后都是可靠的。如果“全屏”程序崩溃,则可能会将终端留在备用屏幕上。但是,您说过您尝试了Shell> Send Hard Reset,它包括切换回主屏幕。如果再次发生,您可以尝试使用以下命令切换回:tput rmcup
Chris Page

另一种可能性是程序使终端带有“滚动区域”。有一些代码告诉终端在滚动时仅滚动行的子范围。程序使用它来显示状态行,例如,不会滚动到屏幕之外的状态行。如果滚动区域不包括第一行,则文本不会滚动到回滚日志中。但是,您再次说过,您尝试过硬重置,这也应该清除。
克里斯·佩奇

2
在我的情况下,似乎发生了什么事,就是我ssh在进入远程计算机时会话失败(超时?)vi,显然将终端留在了“备用屏幕”中(因为vi从未有过清理的机会)。此后,ssh在同一终端中的任何新会话都将出现OP描述的问题,直到我通过选择“ 视图”>“隐藏备用屏幕”菜单项解决了该问题。
Hephaestus

谢谢您,查看>显示/隐藏备用屏幕帮助。它具有一个按键组合,我必须在不知不觉中被击中,并且不知道发生了什么或如何撤消
aexl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.