进一步阅读

进一步阅读

我正在使用 TERM=linux 运行 Centos7。每当我使用 vi 或 vim 打开文件时,bash 窗口中的前 30 行都会被覆盖。 vi 工作正常,但向后滚动时,这 30 行将永远丢失。我从未在 Mac OS、Solaris 或 Oracle Linux 上的 vi 中见过这种行为。知道如何防止这种情况吗?

答案1

恢复终端内容需要术语代码t_tit_te。 Vim 根据 termcap 定义确定此代码(或者是 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。:version在 Vi 内检查。

答案2

你已经不知不觉地习惯了以下的语义终端而不是视频终端。

在旧的纸张终端上,有一个换页控制字符,它会导致(通常是连续的、扇形折叠的)纸张卷起到下一张纸/表格的开头,并且旧行将挂在一长串纸张上位于终端机背面。

在 20 世纪 60 年代、1970 年代和 80 年代的视频终端上,有一个固定尺寸的屏幕,可以被抹去,同时明确地将光标移回起始位置。 (通常是换页控制字符没有做这个。它就像换行符一样,并且会有不同的擦除显示控制序列来擦除屏幕。PRINT CHR$(12)在这方面,视频终端与某些当代家用计算机不同。)

终端模拟器主要遵循视频终端的语义。 (确实,世界经历了视频终端的阶段通常实际上是IBM PC 兼容机运行终端仿真程序,而不是专用机。)但是,(主要)运行在 Unices 和基于 Linux 的操作系统上的 GUI 多年来已经取得了一些成果,其中包括视频终端所不具备的两个重要机制: 这回滚缓冲区替代显示缓冲区

在旧的视频终端上,全屏像或 VIM 这样的程序vi确实会擦除屏幕为了显示其全屏用户界面,您目睹的行为将是很正常的行为。在具有替代屏幕缓冲区vi等的终端模拟器上。实际上,他们被愚弄而切换到替代屏幕缓冲区,他们会擦除该缓冲区并在完成后切换回来。

他们实际上并不认为自己正在切换到替代屏幕缓冲区;他们实际上认为自己正在切换到替代屏幕缓冲区。他们认为他们正在“进入光标寻址模式”。这是 termcap/terminfo 发明的一个想法,即视频终端具有正常的“逐行”模式,其中光标移动控制序列不能完全工作,并且需要切换到“光标寻址模式”才能实现完整的操作。 screen 程序能够在整个屏幕上移动光标。对于大多数类型的现代终端,​​对于所谓的“光标寻址模式”,termcap/terminfo 实际上提供了用于切换到备用屏幕缓冲区和从备用屏幕缓冲区切换的控制序列。

因此,对于您的第一个不匹配的期望,将TERM环境变量设置为linuxterminfo 的“光标寻址模式”的想法不包括切换到备用屏幕缓冲区。这是因为 Linux 中内置的终端仿真器(即linux终端类型所表示的)没有替代的屏幕缓冲区机制。因此,它的 termcap/terminfo 记录没有给出其控制序列。

这引出了一个重要的观点:TERM您在环境变量中的终端类型必须与您的程序在本地或远程通信的实际终端相匹配。 显然,您没有使用 Linux 内置的终端仿真器,也不应该使用linux终端类型。常见的 MacOS 终端仿真器与终端类型iTerm.app等相对应。不,应该不是xtermxterm-256color.

回滚缓冲区是视频终端范例的另一个变化,它有效地重新引入旧的纸质终端语义,将卷起的东西挂在终端顶部。当模拟视频终端滚动时,滚动的内容被推入回滚缓冲区,并且擦除显示(通常)仅擦除回滚缓冲区底部下方的部分。

这里有两件事给你带来困难。

首先,一些 GUI 终端仿真器采取了回到旧的纸质终端语义的想法。 GNOME 终端不会像视频终端那样擦除屏幕根本不, 现在。要求它擦除显示,它会执行换页操作,将所有内容推入回滚缓冲区。 (这不是一个好主意,因为它将擦除显示与换页混为一谈。)请参阅“https://unix.stackexchange.com/q/375743/5132”以获取导致人们出现的问题的示例。如果您已经习惯了 GNOME 终端的处理方式,请注意这些都是非常古老的终端语义,而不是(不太旧的)视频终端语义。

其次,其他一些 GUI 终端模拟器认为备用屏幕缓冲区不应该像主屏幕缓冲区一样,实际上稍微改变一下光标寻址语义。有趣的是,他们的实现者最常选择做的不是滚动,这是一个合乎逻辑的结果没有回滚缓冲区,当备用屏幕缓冲区处于活动状态时。 (遗憾的是,这确实应该与要模拟的实际视频终端机制相关联,即能够使用主机的控制序列关闭和打开“自动右边界换行”,而不管显示缓冲区如何。)

后者是导致你的期望进一步不匹配的原因。当vi或另一个全屏程序在这样的终端仿真器上处于活动状态时,不会是回滚可用,因为全屏程序已切换到备用屏幕缓冲区。要保留回滚,您可以选择摆弄 VIM(这可以通过t_tiet al. 控制)来告诉它不要尝试进入光标寻址模式,这意味着终端模拟器不会切换到备用屏幕缓冲区。但代价是你这样做的代价是返回……呃……前进到全屏节目的视频终端语义擦除所有的基本的展示在回滚缓冲区下方。

进一步阅读

  • 乔纳森·德博因·波拉德 (2019)。 ”学期”。 杂项。诺什工具集。

答案3

我似乎偶然发现了获得 @JdeBP 所说的“纸质终端语义”的解决方案。即,将 :set term=builtin_ansi 添加到 .vimrc

完成此操作后,我可以在 Mac 和 Linux 机器上将 TERM 设置为 linux,并且一切正常,包括退格键和箭头键。

顺便说一句,我也尝试添加 :set t_ti? t_te?到.vimrc,但不仅不起作用,vi还抱怨问号。

相关内容