我正在运行Centos7和TERM=linux。每当我用vi或vim打开一个文件时,bash窗口中的前30行都会被写入。vi工作良好,但当滚动回来,这30条线永远失去。我从未见过在Mac、Solaris或Oracle Linux上使用vi的这种行为。知道怎么防止这事吗?
发布于 2020-06-09 05:21:31
恢复终端内容需要术语代码t_ti和t_te。Vim根据术语上限定义(或者是termlib?)确定这些代码。这些术语代码似乎不适用于TERM=linux。
通过执行
:set t_ti? t_te?这将显示这两个代码没有被设置。
如果将以下内容放入您的vimrc中,它可能会起作用:
set t_ti=^[7^[[r^[[?47h t_te=^[[?47l^[8重要事项:^[是转义字符,键入<C-v><esc>插入它。
在:h restorescreen中提到了这一点(一个Windows选项)。
顺便说一句:一旦Vim开始运行,它就是终端的主人。所以只有在你离开Vim之后才有可能回滚。vi也是一个Vim。在Vi内检查:version。
发布于 2020-06-18 06:19:18
你已经不知不觉地习惯了纸质终端的语义,而不是视频终端。
在旧纸终端上,有一个表单馈送控制字符,它导致(通常是连续的、扇形折叠的)纸张卷到下一张纸/表单的开头,而旧的线条将出现在从终端背面挂起的一长串纸上。
在20世纪60年代、70年代和80年代的视频终端上,有一个固定大小的屏幕可以被擦除,同时显式地将光标移回家庭位置。(通常表单Feed控制字符不会这样做。它就像换行符一样,会有一个不同的擦除显示控制序列来擦除屏幕。在这方面,视频终端不像一些当代家用电脑的PRINT CHR$(12)。
终端仿真器主要遵循视频终端的语义。(事实上,世界经历了视频终端的一个阶段-通常是运行终端仿真程序的IBM兼容计算机,而不是专用机器。)但是(主要是)运行在Unice和基于Linux的操作系统上的GUI已经取得了一些成果,其中包括视频终端没有的两种重要机制:回滚缓冲区和替代显示缓冲区。
在旧的视频终端上,像vi或VIM这样的全屏程序确实会擦除屏幕,以显示其全屏用户界面,而您所看到的行为将是非常正常的行为。在终端仿真器上有可选的屏幕缓冲区vi等。实际上是被愚弄到切换到替代的屏幕缓冲区,他们擦除和切换从当他们完成。
他们实际上并不认为他们正在切换到另一个屏幕缓冲区;他们认为他们正在“进入游标寻址模式”。这是术语上限/终端发明的一个想法,即视频终端有一个正常的“逐行”模式,其中光标运动控制序列不能完全工作,还有一个“光标寻址模式”需要转换为全屏程序才能将光标在整个屏幕上移动。对于大多数类型的现代终端,对于假定的“游标寻址模式”术语/终端,实际上提供了切换到和从另一个屏幕缓冲器切换的控制序列。
因此,对于第一个不匹配的期望,将TERM环境变量设置为linux终端时,“游标寻址模式”不包括切换到另一个屏幕缓冲区。这是因为内置在Linux中的终端模拟器(也就是linux终端类型所指的)没有另一种屏幕缓冲机制。因此,它的术语/终止记录没有给出一个控制序列。
这就引出了一个重要的问题:TERM环境变量中的终端类型必须与程序在本地或远程进行对话的实际终端相匹配。显然,您没有使用Linux内置终端模拟器,也不应该使用linux终端类型。常见的MacOS终端仿真器对应于终端类型iTerm.app等。不,不应该是xterm或xterm-256color。
回滚缓冲区是视频终端模式的另一个改变,它有效地重新引入了旧的纸终端语义,即将一张滚动的东西挂在终端的顶部。当模拟视频终端滚动时,滚动的东西被推入回滚缓冲区,并且擦除显示(通常)只擦除位于回滚缓冲区底部的部分。
这里有两件事会给你带来困难。
首先,一些GUI终端仿真器采用了追溯到旧的纸终端语义的想法。现在,GNOME终端根本不像视频终端那样擦除屏幕。要求它擦除显示,它将执行表单Feed,将所有内容推入回滚缓冲区。(这不是一个好主意,因为它将擦除显示与表单Feed混为一谈。)有关引起人们的问题的例子,请参阅"https://unix.stackexchange.com/q/375743/5132“。如果您已经习惯了GNOME终端的做事方式,请注意这些是非常古老的纸终端语义,而不是(不太老的)视频终端。
其次,其他一些GUI终端仿真器认为,替代的屏幕缓冲区不应该像主缓冲区那样,实际上确实会稍微改变游标寻址语义。有趣的是,当可选的屏幕缓冲区处于活动状态时,它们的实现者最常选择的是不做滚动操作,因此逻辑上没有回滚缓冲区。(令人遗憾的是,这实际上应该与实际的视频终端机制相联系,即不管显示缓冲区如何,都可以将“自动右边框包装”与主机上的控制序列连在一起。)
这就是导致你的期望进一步不匹配的原因。当vi或其他全屏程序在这样的终端模拟器上处于活动状态时,将无法使用回滚,因为全屏程序已切换到可选的屏幕缓冲区。若要保留回滚,您可以选择使用VIM ( t_ti等人可以控制这一点)。要告诉它不要尝试进入游标寻址模式,这意味着终端仿真器将不会切换到另一个屏幕缓冲区。但权衡的是,这样做的代价是返回…。erm…转发到全屏程序的视频终端语义,擦除滚动回缓冲区下面的所有主显示器。
发布于 2020-09-13 02:36:38
我似乎无意中找到了获得@JdeBP所称的“纸终端语义”的解决方案。即添加:将term=builtin_ansi设置为.vimrc
完成这一任务后,我可以在我的Mac和linux机器上将术语设置为Linux,一切都很完美,包括后置空间和箭头键。
顺便说一句,我还尝试添加:set t_ti?t_te?对.vimrc来说,这不仅不起作用,vi还抱怨问号。
https://unix.stackexchange.com/questions/591516
复制相似问题