当我在终端工作时,我会看到最后一个shell命令执行输出的历史记录。如果我运行vim,我会全屏看到我打开的文件。当我退出vim时,我可以再次看到最后一个shell命令的历史记录。
然而,当我在屏幕上使用vim时。我在退出vim时看到了我刚刚编辑的文件的足迹,而不是最后一个shell命令的历史记录不过我想看看这个贝壳的历史
我如何实现这种行为
我用过:
- terminal.app和iterm2.app
- 尝试将xterm切换为xterm-256color(在iterm2.app中)
- 选中和取消选中"当应用程序状态栏存在时,保存行以进行滚动"one_answers"在交替屏幕模式下保存行以滚动"(在iterm2中)
- 将termcapinfo xterm ti@:te@添加到.screenrc中(尽管这应该是相反问题的解决方案,但为什么不尝试呢)
- sshing到linux机器并尝试在那里使用gnu屏幕
到目前为止,我还没有得到想要的行为。
p.S.
我在谷歌上搜索了一下,看到了一些试图解决相反问题的人的评论:
你们中的许多人可能知道基于控制台的程序的烦人行为,比如less或vi,在退出后恢复屏幕,这样你刚才看到的文本就会消失。
这种行为背后的主要思想是程序是否使用备用屏幕来保存shell历史的图片,并在vim退出时显示它。因此,如果一个人想解决相反的问题,他应该
驱魔备用屏幕
更新:我忘记了screen
的一个功能,该功能默认禁用备用屏幕支持。
将altscreen on
添加到您的$HOME/.screenrc
以启用它。这可能是您所要做的全部;对$TERM
、$TERMCAP
和$TERMINFO
的所有干扰可能都是不必要的。不管怎样,我还是把剩下的答案留在这里。
我在自己的.screenrc
中已经有这么长时间了,我忘了。
要为当前会话启用此功能,请键入screen
转义符(默认情况下为Cntrl-A),然后键入:altscreen on
Enter。
如果没有这一点,screen
将不会对转义序列做出响应,即使它们是在terminfo或termcap中定义的。
vim
(和less
,以及大多数其他基于curses的全屏程序)使用终端terminfo条目定义的smcup
和rmcup
字符串。(在旧的术语上限系统中,它们分别被称为ti
和te
)。smcup
切换到备用屏幕,rmcup
切换回主屏幕。
如果terminfo条目没有这些字符串,程序将无法执行此操作。
默认情况下,screen命令会将$TERM
设置为"screen"
。显然,"屏幕"terminfo条目没有smcup
和rmcup
。
如果你想破解terminfo条目,你可以修改"屏幕"的现有信息,添加smcup
和rmcup
。您需要infocmp
命令将terminfo转换为文本,并需要tic
将其转换回terminfo使用的二进制形式。
一个更简单的解决方案是将$TERM
环境变量设置为调用screen
命令之前的任何值。现在几乎所有的终端模拟器都是基于旧的DECVT100,所以它们应该足够兼容。
例如,在我的系统上,当我登录时,我有TERM=xterm
;它可能是MacOS上的其他东西。在screen
会话中,默认情况下,我会有:
$ echo $TERM
screen
我可以这样把它改成xterm
:
$ export TERM=xterm
(同样,用系统上的$TERM
替换"xterm"。)
您也可以添加
term xterm
到您的$HOME/.screenrc
。事实上,screen
有许多选项可以调整您的termcap/terminfo设置;man screen
,搜索"terminfo"以获取血腥细节。