sti*_*ray 8 command-line gnome-terminal 16.04
最初我认为无限滚动不适用于 16.04 上的终端应用程序。我没有选中“限制回滚到”选项。有时它会向后滚动,有时它不会。然后我意识到当我使用clear命令时它不会回滚。它只向后滚动一个屏幕。
我经常使用 clear(几乎每 3 个命令一次)。
clear 的手册页指向 terminfo。terminfo 上有一些选项,但我找不到可以在其中定义选项的配置文件。/lib/terminfo/ 下的所有文件似乎都在读取它的配置,这些文件都是编译格式,我不理解它们。
我在 14.04 之前没有看到这个问题(猜测)。
任何帮助是极大的赞赏。
谢谢。
小智 12
这花了我一段时间才弄明白,所以我想我应该分享一下我是如何让它工作的。
如果你输入“man clear”,你会看到手册上写着:
如果可能,clear 会清除您的屏幕,包括其回滚缓冲区(如果定义了扩展的“E3”功能)。
我们将删除此 E3 功能:
首先,找出您的终端类型:
echo $TERM
Run Code Online (Sandbox Code Playgroud)
对我来说,这导致了“xterm-256color”。不管它输出什么,记住它。
现在输入命令:
infocmp -x xterm-256color > tempfile
Run Code Online (Sandbox Code Playgroud)
显然,您将 xterm-256color 替换为第一个命令的输出。这将输出此终端类型的扩展功能到“tempfile”。
现在编辑这个新创建的文件。您正在寻找:
E3=\E[3J,
Run Code Online (Sandbox Code Playgroud)
找到它并删除它。整个事情,所以如果它看起来像:
...
Cs=\E]12;%p1%s\007, E3=\E[3J,
Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q,
...
Run Code Online (Sandbox Code Playgroud)
它现在应该是这样的:
...
Cs=\E]12;%p1%s\007,
Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q,
...
Run Code Online (Sandbox Code Playgroud)
保存文件。并从您的终端执行:
sudo tic -x tempfile
Run Code Online (Sandbox Code Playgroud)
这将加载您修改后的 terminfo 并存储它。重新启动终端并清除现在应该不再删除滚动缓冲区
简短的回答:如果您有相对较新的版本clear,您可以避免通过选项清除滚动缓冲区-x。
长答案:
clearcommans 是 的一部分ncurses。
根据变更日志,
20130622
+ 修改clear程序以考虑 E3 扩展
功能,以清除终端的回滚缓冲区(
Miroslav Lichvar 的补丁,Redhat #815790)。
因此OP的猜测
我在 14.04 之前没有看到这个问题(猜测)。
也许是对的。变更日志还说
20170819
+-x在clear/tput 中添加选项以使E3 扩展成为可选
(参见:20130622)。
-x因此,如果发布日期ncurses等于或晚于 2017-08-19,则可以使用选项。这可以通过命令检查clear -V。例如,
$ clear -V
ncurses 6.1.20180127
Run Code Online (Sandbox Code Playgroud)
这可以理解为“ncurses 6.1发布于2018-01-27”。
我确认,就我使用的官方存储库而言,该过程在
Arch Linux
Arch Linux ARM
Linut Mint 19
Ubuntu 20.04
Raspbian Buster Lite
并且无效于
Raspbian Stretch Lite(这比 更旧Buster。)这个答案建立在黄貂鱼的答案之上(他做了一些非常好的工作)并且旨在完成它。
1 - 要在不丢失回滚的情况下进行清除,请在控制台中输入以下命令(不需要按照 stringray 的答案中的建议使用 python):
printf '\33[H\33[2J'
Run Code Online (Sandbox Code Playgroud)
2 - 为避免记住这一点,您可以编辑 .bashrc 文件为其创建别名。我会称别名为clear。在 bash 中,输入:
nano ~/.bashrc
Run Code Online (Sandbox Code Playgroud)
并在最后添加这一行:
alias clean="printf '\33[H\33[2J'"
Run Code Online (Sandbox Code Playgroud)
我还想添加 div(用于分隔符):
alias div='echo;echo "------------------------------------------------------------------------------";echo;echo;echo;echo;echo;echo;echo;echo;echo;echo;echo;echo "------------------------------------------------------------------------------";clean'
Run Code Online (Sandbox Code Playgroud)
这使得当你执行 div 命令时,它进入两个分隔符,它们之间有 10 个新行,然后是一个干净的命令。这将使当您向后滚动时,您将确切知道您使用 div 的位置。
您可以通过在我列出的过程之前执行 sudo su 来更改 sudo bash 行为。
我会推荐这个超过 bashBedlam 使用 tic 的答案,作为编辑 .bashrc:
1) 它不需要 sudo 权限,可以随时随地轻松使用。
2)只影响你的用户(不是所有的用户都会想要修改后的清除功能)
3) 将在通常不涉及 bashrc 的更新中幸存下来
小智 5
如上所述,clear -x确实有窍门。
但是,如果您像我一样,习惯性地clear每天输入数百次,并且不希望不训练您的手指,那么您可能需要创建一个简单的别名.bashrc(或等效项),如下所示: alias clear='clear -x'。