每当我在终端中运行clear时,它都会删除从屏幕顶部到当前行的回滚缓冲区。我在xterm、st、urxvt都试过了,问题依旧。有什么方法可以改变清除的行为,使其不接触回滚缓冲区?
答案1
“从屏幕顶部到当前行”的注释是不明确的。如果你的意思是从顶部可见部分屏幕上的那不是回滚。终端的回滚是您只能通过使用滚动条(或合适的键,例如shift pageup)才能看到的部分。
XTerm 控制序列记录相关的转义序列:
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).
终端描述能力clear
使用倒数第二个,例如,
clear=\E[H\E[2J
将光标定位到左上角,然后清除整个(可见)屏幕。你可以使用擦除下方,但终端描述中未使用它。
参考清除回滚:这是一个特定于终端的功能,最初是 xterm 中的转义序列(1999年,记录在ctlseqs.ms但在更改中没有提及)和后来的(2011年)作为 Linux 控制台的扩展和相应的终端描述来实现。终端数据库将其列为“杂项扩展”。
目前,这些终端描述具有以下特点:
是否在类似 xterm 的 VTE 中受支持必须通过测试来回答(VTE 或 Konsole 没有有用的文档)。
如果您不想使用扩展程序,可以删除E3
您使用的终端描述中的功能,例如,
infocmp -1x >foo
edit foo, removing the line with "E3="
tic -x foo
我建议使用选项-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),
例如,uxrvt
设置$TERM
为类似 的内容rxvt-unicode
,在 中生成如下行infocmp
:
# Reconstructed via infocmp from file: /lib/terminfo/r/rxvt-unicode
rxvt-unicode|rxvt-unicode terminal (X Window System),
该st
程序使用xterm
(或可能xterm-256color
),尽管我已经有一段时间没有看到该程序的副本了那效果很好,值得评论。
顺便说一下,你可以有一个别名,用于clear
发送给定的转义序列(忽略终端描述),但我还没有看到任何人报告这一点。
如果您想“清除上面”,这并不像输入“clear”那么简单。转义符\033[1J
会从左上角擦除到当前光标位置。您可以制作一个执行此操作的脚本,以仅清除线在当前光标上方:
- 使用光标位置报告查找光标当前所在的行/列,以及
- 如果光标不在第一行(保存该位置),则将光标向上移动一行,然后(按照顺序
hpa
)移动正确的大量的, - 发出“上面清楚”,并且
cup
使用(光标寻址)返回到原始位置。
带有光标位置报告的部分似乎不适用于(例如)readline 绑定,所以我建议了一个脚本。如果不存在位于第一行的问题,您可以创建使用保存/恢复游标功能的绑定。
答案2
.bashrc
我遇到了同样的问题并在帮助中添加了别名:
alias clear='printf "\E[H\E[2J"'
提醒:更改将.bashrc
在您打开新终端后生效!
答案3
我经常使用clear
命令提示符移动到屏幕顶部并无意中擦除回滚缓冲区,其中通常包含重要内容,例如先前操作中的有用错误消息。
检查手册页,它明确指出:
如果可能的话,clear 会清除屏幕,包括其回滚缓冲区(如果定义了扩展的“E3”功能)。
那里还有一个选项:
-x 不尝试使用扩展的“E3”功能清除终端的回滚缓冲区。
从那时起,我将其添加到 ~/.bashrc 中的别名列表中:
alias clear='clear -x'
当我运行时,我仍然收到移至顶部的提示clear
,但现在如果需要,我可以进一步向上滚动。