23

当我在终端工作时,我会看到最后一个 shell 命令执行输出的历史记录。如果我运行 vim,我会看到全屏打开的文件。当我退出 vim 时,我可以再次看到最后一个 shell 命令的历史记录。

但是,当我从屏幕使用 vim 时。我在退出 vim 时看到了我刚刚编辑的文件的足迹,而不是最后一个 shell 命令的历史记录。不过,我想看看 shell 的历史。

我怎样才能实现这种行为?

我用了:

  • terminal.app 和 iterm2.app
  • 尝试将 xterm 切换到 xterm-256color(在 iterm2.app 中)
  • 选中和取消选中“当存在应用状态栏时保存行以回滚”和“保存行以在备用屏幕模式下回滚”(在 iterm2 中)
  • 将 termcapinfo xterm ti@:te@ 添加到 .screenrc (虽然它应该是相反问题的解决方案,但为什么不尝试)
  • sshing 到 linux 机器并尝试在那里使用 gnu-screen

到目前为止,我还没有得到想要的行为。

附言

我用谷歌搜索了一下,看到了试图解决相反问题的人的评论:

你们中的许多人可能都知道基于控制台的程序的烦人行为,例如 less 或 vi 在退出后恢复屏幕以使您刚刚在那里的文本消失。

这种行为背后的主要思想是程序是否使用备用屏幕来保存 shell 历史的图片并在 vim 退出时显示它。因此,如果一个人想要解决相反的问题,他应该

驱邪备用画面

4

1 回答 1

31

更新:我忘记了screen默认禁用备用屏幕支持的功能。

添加altscreen on到您的$HOME/.screenrc以启用它。这可能是您所要做的。所有关于$TERM, $TERMCAP, 和的搞砸$TERMINFO可能是不必要的。无论如何,我将把剩下的答案留在这里。

我自己有这个.screenrc太久了,它让我忘记了。

要为当前会话启用此功能,请键入您的screen转义字符(Cntrl-A默认情况下),后跟:altscreen on Enter.

没有这个,screen将不会响应转义序列,即使它们是在 terminfo 或 termcap 中定义的。


vim(andless和大多数其他基于 curses 的全屏程序)使用终端的 terminfo 条目定义的smcup和字符串。rmcup(在旧的 termcap 系统中,它们分别称为tite)。 smcup切换到备用屏幕,然后rmcup切换回主屏幕。

如果您的 terminfo 条目没有这些字符串,程序将无法做到这一点。

默认情况下,screen 命令将您设置$TERM"screen". 显然“屏幕” terminfo 条目没有smcupand rmcup

如果您想破解 terminfo 条目,您可以修改“屏幕”的现有信息以添加smcuprmcup. 您需要该infocmp命令将您的 terminfo 转换为文本,并将tic其转换回 terminfo 使用的二进制形式。

一个更简单的解决方案是将环境变量设置为调用命令$TERM之前的任何值。screen现在几乎所有的终端仿真器都是基于旧的 DEC VT100,所以它们应该足够兼容。

例如,在我的系统上,当我登录时,我有TERM=xterm;它可能是 MacOS 上的其他东西。在screen会话中,默认情况下,我将拥有:

 $ echo $TERM
 screen

我可以把它改成xterm这样:

$ export TERM=xterm

$TERM(再次,用您系统上的任何内容替换“xterm” 。)

您还可以添加

term xterm

到你的$HOME/.screenrc. 事实上screen,有许多选项可以调整您的 termcap/terminfo 设置;man screen并搜索“terminfo”以获取血腥细节。

于 2013-07-25T21:52:53.620 回答