每当我在终端中运行 clear 时,它都会删除从屏幕顶部到当前行的回滚缓冲区。我已经在 xterm、st 和 urxvt 中尝试过,问题仍然存在。有什么办法可以改变 clear 的行为,这样它就不会触及回滚缓冲区吗?
“从屏幕顶部到当前行”的注释含糊不清。如果您的意思是从屏幕可见部分的顶部开始,那不是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/xterm
ncurses 将使用路径名AX
和XT
扩展功能(如E3
),与-x
选项一起显示。如果您使用多个终端类型,则必须对每个( 的值$TERM
)执行此操作,并且更改仅适用于您运行 的机器clear
。infocmp
输出的前几行显示您正在处理哪一行:
# 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 绑定,所以我建议了一个脚本。如果没有出现在第一行的问题,您可以使用保存/恢复游标功能进行绑定。