Bash clear 命令奇怪的行为会删除回滚缓冲区。

Alv*_*lvo 2 shell

每当我在终端中运行 clear 时,它都会删除从屏幕顶部到当前行的回滚缓冲区。我已经在 xterm、st 和 urxvt 中尝试过,问题仍然存在。有什么办法可以改变 clear 的行为,这样它就不会触及回滚缓冲区吗?

Tho*_*key 5

“从屏幕顶部到当前行”的注释含糊不清。如果您的意思是从屏幕可见部分的顶部开始,那不是scrollback。终端的回滚是您只能通过使用滚动条(或合适的键,例如 shift pageup)才能看到的部分。

XTerm Control Sequences记录了相关的转义序列:

CSI Ps J  Erase in Display (ED).
            Ps = 0  -> Erase Below (default).
            Ps = 1  -> Erase Above.
            Ps = 2  -> Erase All.
            Ps = 3  -> Erase Saved Lines (xterm).
Run Code Online (Sandbox Code Playgroud)

终端描述能力clear使用倒数第二个,例如,

clear=\E[H\E[2J
Run Code Online (Sandbox Code Playgroud)

将光标定位到左上角,然后清除整个(可见)屏幕。您可以使用Erase below,但在终端描述中没有使用。

参考清除回滚:这是一个特定于终端的功能,最初是 xterm 中的转义序列(1999 年,记录在ctlseqs.ms 中但未在更改中提及)和后来(2011 年)实现为 Linux 控制台的扩展和相应的终端描述. 终端数据库将其列为“杂项扩展”

目前,这些终端描述具有以下特点:

它是否在类似 VTE 的 xterm 中受支持必须通过测试来回答(没有适用于 VTE 或 Konsole 的有用文档)。

如果您不想使用扩展名,您可以E3从您使用的终端描述中删除该功能,例如,

infocmp -1x >foo
edit foo, removing the line with "E3="
tic -x foo
Run Code Online (Sandbox Code Playgroud)

我建议使用选项-1-x简化格式并显示要更改的功能。https://ghostbin.com/paste/kfsbj 中给出的示例与该建议一致:

  • /home/flowerpick/.terminfo/x/xtermncurses 将使用路径名
  • 功能AXXT扩展功能(如E3),与-x选项一起显示。

如果您使用多个终端类型,则必须对每个( 的值$TERM)执行此操作,并且更改仅适用于您运行 的机器clearinfocmp输出的前几行显示您正在处理哪一行:

#   Reconstructed via infocmp from file: /home/flowerpick/.terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),
Run Code Online (Sandbox Code Playgroud)

例如,uxrvt设置$TERM为类似的东西rxvt-unicode,在 中产生这样的行infocmp

#       Reconstructed via infocmp from file: /lib/terminfo/r/rxvt-unicode       
rxvt-unicode|rxvt-unicode terminal (X Window System),
Run Code Online (Sandbox Code Playgroud)

st程序使用xterm(或可能xterm-256color),虽然它已经有一段时间,因为我看到的副本其在工作不够好评论。

顺便说一下,你可以有一个别名来clear发送给定的转义序列(忽略终端描述),但我没有看到任何人报告过这个。

如果你想“清除上面”,那不像输入“清除”那么简单。转义\033[1J从左上角到当前光标位置擦除。您可以制作一个执行此操作的脚本,以仅清除当前光标上方的

  • 使用光标位置报告查找光标当前所在的行/列,以及
  • 如果光标不在第一行,(保存该位置),将光标向上移动一行,然后(按hpa顺序)向右移动一个大数字,
  • 发出“上面清楚”,和
  • 使用cup(光标寻址)返回到原始位置。

带有光标位置报告的那部分似乎不适用于(例如)readline 绑定,所以我建议了一个脚本。如果没有出现在第一行的问题,您可以使用保存/恢复游标功能进行绑定。